8. 字符串转换整数 (atoi) - 力扣(LeetCode)
参考 力扣7 面对三十二位带符号整数的范围限制,用到INT_MAX和INT_MIN两个常量限定范围。(应对leetcode中的溢出问题)
- 使用 long long
class Solution {
public:
int myAtoi(string s) {
int k = 0;
while(k<s.size() && s[k]==' ') k++;//处理空格
if(k==s.size()) return 0;//空字符串的情况
int minus = 1;//标志符号
if(s[k]=='-') minus = -1, k++;
else if(s[k]=='+') k++;
long long res = 0;
while(k<s.size() && s[k]>='0' && s[k]<='9'){
res = res*10+s[k]-'0';//字符转数字
k++;
if(res > INT_MAX) break;//超出32位范围
}
res *= minus;//计算正负
if(res > INT_MAX) res = INT_MAX;
if(res < INT_MIN) res = INT_MIN;
return res;
}
};
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 使用 int
class Solution {
public:
int myAtoi(string s) {
int k = 0;
while(k<s.size() && s[k]==' ') k++;//处理空格
if(k==s.size()) return 0;//空字符串的情况
int minus = 1;//标志符号
if(s[k]=='-') minus = -1, k++;
else if(s[k]=='+') k++;
int res = 0;
while(k<s.size() && s[k]>='0' && s[k]<='9'){
//int主要在于此处是否会溢出
int x = s[k]-'0';
if(minus>0 && res>(INT_MAX-x)/10) return INT_MAX;//判断同力扣7题中
if(minus<0 && -res<(INT_MIN+x)/10) return INT_MIN;
//此处由于INT_MIN为负数,比INT_MAX的绝对值大1;当输入INT_MIN时,正数形式的计算会产生错误,因此需要单独处理
if(-res*10-x == INT_MIN) return INT_MIN;
res = res*10+x;
k++;
if(res > INT_MAX) break;//超出32位整数范围,跳出
}
res *= minus;//计算正负
if(res > INT_MAX) res = INT_MAX;// 处理溢出情况
if(res < INT_MIN) res = INT_MIN;
return res;
}
};
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.