原文链接:https://leetcode-cn.com/problems/string-to-integer-atoi/
解题思路
看到字符串那就先转换为char[]。
这道题,就从左往右开始遍历。寻找数据的起始值。情况如下。
- 遇到空格则跳过。
- 非空格情况
- 符号'-'或者'+'则记录为正还是负任然后开始处理数据转换,将当前index++之后开始处理数据。
- 符号不是数字则返回0.是数字则开始记录当前index,开始处理数字。
寻找到起始值之后开始向右遍历转换数字。
数字获取可以通过
char转换为int 可以用 '1' - 48 = 1 来实现。并将计算值乘上1 或者 -1。
pop = (charList[i] -48) * zf; 其中zf为之前根据'+'或者'-'。默认为1,
叠加结果为:
rev = rev * 10 + pop;
但是执行这一步之前需要判断,rev是否移除才能进行相加。情况如下:
- 叠加上去的结果不能大于Integer.MAX_VALUE,否则返回Integer.MAX_VALUE
- 且不能小于Integer.MIN_VALUE,否则返回Integer.MIN_VALUE,则进行处理。
- 若大于
if(rev>Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)){
return Integer.MAX_VALUE;
}
if(rev<Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)){
return Integer.MIN_VALUE;
}
循环结束或者遇到非数字情况。则直接return rev;即可。
class Solution {
public int myAtoi(String str) {
int rev = 0;
char[] charList = str.toCharArray();
int length = str.length();
int zf = 1;
int i = 0;
int pop = 0;
for(; i < length; i++){
if(charList[i] == ' '){
continue;
}else{
if(charList[i] == '-'){
i++;
zf = -1;
break;
}
if(charList[i] == '+'){
i++;
break;
}
if(charList[i] <'0' || charList[i] >'9'){
return 0;
}else{
break;
}
}
}
if(i == length){
return 0;
}
for(;i < length; i++){
if(charList[i] <'0' || charList[i] >'9'){
return rev;
}
pop = (charList[i] -48) * zf;
if(rev>Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)){
return Integer.MAX_VALUE;
}
if(rev<Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)){
return Integer.MIN_VALUE;
}
rev = rev * 10 + pop;
}
return rev;
}
}