期末考试结束了
Num 8 字符串转整数(atoi)
题目本身没有难点:几个容易理解错的点
- --32是不合法的(正负号只能有一个)
- +32合法(可以添加+)
- word123是不合法的(只要第一个非空不是数字或者正负号就不行)
我犯错的样例:2147483648
刚开始看到一个思路是用 ans和INT_MAX/10比来规避溢出,实际上要考虑到等号的时候,对于INT_MAX 如果str是8或者9是会溢出的,对于INT_MIN,str9溢出
写的numpd要注意,不能判断+-,所以end从first+1开始。并且因为end是符合+1,最后的str[end]是不符合的第一个,这时候就需要end=end-1,变回真实的有效值
class Solution { public: bool numpd(string str,int num) { if(str[num]>='0' && str[num]<='9') return true; return false; } int changeone(string str,int first,int end) { int len=end-first; long ans=0; for(int i=first+1;i<=end;i++) { //printf("one"); if(str[first]=='-') { // cout<<abs(ans)<<" "<<INT_MIN/10<<endl; if(abs(ans)>INT_MAX/10||(abs(ans)==INT_MAX/10 && str[i]=='9')) return INT_MIN; ans=ans*10+'0'-str[i]; //printf("hah"); } else { //cout<<ans<<endl; if(ans>INT_MAX/10 || (ans==INT_MAX/10 && str[i]>='8')) return INT_MAX; ans=ans*10+str[i]-'0'; } } return ans; } int changesecond(string str,int first,int end) { int len=end-first+1; long ans=0; for(int i=first;i<=end;i++) { //cout<<"this"<<ans<<endl; if(ans>INT_MAX/10 || (ans==INT_MAX/10 && str[i]>='8')) return INT_MAX; ans=ans*10+str[i]-'0'; } //if(ans<=INT_MIN) return INT_MIN; return ans; } int myAtoi(string str) { int first=0; int end=0; int len=str.length(); while(first<len && str[first]==' ') first++; if(first==len ||(numpd(str,first)==false && str[first]!='+'&&str[first]!='-')) return 0; //printf("hah"); end=first+1;//避免负号 while(end<len && numpd(str,end)) end++; end=end-1; if(end<first && (str[first]=='-'||str[first]=='+')) return 0; if (str[first]=='-'||str[first]=='+') return changeone(str,first,end); else return changesecond(str,first,end); } };