剑指offer 把字符串转化为整数
题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
+2147483647 1a33
输出
2147483647 0
思路:字符串转化为整数的方法num = num * 10 + str[i] - '0';
特殊情况:1、输入字符串为NULL;
2、输入字符串只有+/-;
3、转化的数字大于最大值或小于最小值;
4、输入的字符串有字母。
使用一个全局变量进行处理,因为非法情况需要返回0,但是字符串只有0时,也只能返回0,需要使用一个全局变量来进行辨别。
全部变量赋值技巧,首先赋值为true,进行程序就需要赋值为false,如果没有进行运算,说明是非法情况1、2,调用函数后,
如果是最大最小值退出的情况,全部变量也是false,只有正常处理完字符串遇到\0之后,才能修改全局变量,变为true。
class Solution { public: bool status = false;//false是非法的,true是合法的 /*1 输入为空 2 输入含有字母 3 输入只有+- 4最大最小值超限 */ long long solution(char* str,int minus){ long long num = 0; int i = 0; for(i = 0;str[i] != '\0';++i){ if(str[i] >= '0' && str[i] <= '9'){//是数字就计算 num = num * 10 + str[i] - '0'; /*if(minus && num > 0x7FFFFFFF || !minus && -num < (signed int) 0x80000000){ num = 0; break; }*/ } else{//不是数字就退出 num = 0; break; } } if(str[i] == '\0'){ status = true; } return minus == -1 ? -num : num; } int StrToInt(string str) { if(str.size() == 0){ return 0; } //find + / - status = true; int minus = 1; char *p = new char(str.size() + 1); char * tmp = p; strcpy(p,str.c_str());//首先判断是正数还是负数 if(p[0] == '+'){ minus = 1; ++p; } if(p[0] == '-'){ minus = -1; ++p; } int result = 0;//首先初始化为0,如果只有一个+/-那么不会调用函数直接返回0 if(*p != '\0'){//可以判断只有一个+/- result = solution(p,minus); } delete[] tmp;//删除首地址开始的那一片内存地址。 return result; } };
delete删除的必须是首地址,因为p已经发生了移位操作不是首地址了,所以需要最开始的保存首地址。