leetcode8.字符串转换整数(atoi)——学习笔记

题目:力扣leetcode8.字符串转换整数(atoi)——学习笔记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;
    }
}

leetcode8.字符串转换整数(atoi)——学习笔记


思路:通过.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;

上一篇:转:决策树 decision tree


下一篇:7-5 Tree Traversals Again (25分)