题目:力扣https://leetcode-cn.com/problems/string-to-integer-atoi/
class Solution {
public int myAtoi(String s) {
char[] charArray = s.toCharArray();
//去除前导空格
int index=0;
while(index<s.length()){
if(charArray[index] != ' '){
break;
}
index++;
}
if(index==s.length()){
return 0;
}
//处理正负号
int flag = 1;
if(charArray[index]=='-'){
flag = -1;
index++;
}else if(charArray[index]=='+'){
index++;
}
//读取有效数字
int ans=0;
while(index<s.length()){
char temp = charArray[index];
if(temp<'0'||temp>'9'){
break;
}
int backups = ans;
ans = ans*10+(temp-'0');
if(ans/10 != backups){
return (flag==(-1)) ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
index++;
}
return ans*flag;
}
}
思路:通过.toCharArray()将字符串转换为字符数组,然后通过index索引对其分步操作。依题意,先去除前导空格,然后再判断正负,最后再读取数字,在读取的时候要注意数值越界的问题。
1. 将传入的字符串转换为字符数组。
char[] charArray = s.toCharArray();
2.去除前导空格。index是索引,用于控制字符数组charArray的操作位置。依题意,index需要跳过前导空格,所以用一个while循环和index++去实现,若判断当前位置不为‘ ’则跳出循环。index==s.length()则返回一个0,这是为了避免如同‘ ’这样的极端例子。
//去除前导空格
int index=0;
while(index<s.length()){
if(charArray[index] != ' '){
break;
}
index++;
}
if(index==s.length()){
return 0;
}
3.处理正负号。flag是标记该字符串中数值的正负,若字符串中没有‘+’或‘-’则默认为正数,所以flag的默认值为1。若字符串中出现‘-’则改变flag为-1。不论出现‘+’或者‘-’,此时此刻index都指向一个符号,为了方便后续的处理,都需要进行index++处理,是index指向下一个元素。
//处理正负号
int flag = 1;
if(charArray[index]=='-'){
flag = -1;
index++;
}else if(charArray[index]=='+'){
index++;
}
4.读取有效数字。先声明一个char类型的对象temp,将字符数组中对应的元素的值赋值给temp,然后对temp进行判断,判断是否为数字。是,则继续;否,则可以直接跳出循环。backups为备份,即可以理解为上一步的ans。ans是通过计算后最后的值,因为temp总为个位数,因此ans依然与上一步的ans(也就是备份backups)只差10倍(因为个位数在ans/10之后被舍去了)。若ans/10!=backups则表示ans的值已经越界,此时只需根据flag的值判断正负,若为正则返回上界,若为负则返回下界;否则,即表示没有越界,只需要把flag表示正负的值乘进去即可。
//读取有效数字
int ans=0;
while(index<s.length()){
char temp = charArray[index];
if(temp<'0'||temp>'9'){
break;
}
int backups = ans;
ans = ans*10+(temp-'0');
if(ans/10 != backups){
return (flag==(-1)) ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
index++;
}
5.将表示符号的flag乘进去,返回即可。
return ans*flag;