題目描述
將一個字符串轉換成一個整數,要求不能使用字符串轉換整數的庫函數。 數值為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已經發生了移位操作不是首地址了,所以需要最開始的保存首地址。