面试题67. 把字符串转换成整数

题目:

 

 

思路:

【1】以下四种字符需要考虑:

首部空格: 删除之即可;
符号位: 三种情况,即 '+' , '− , '无符号' ;新建一个变量保存符号位,返回前判断正负即可。
非数字字符: 遇到首个非数字的字符时,应立即返回。
数字字符:
        字符转数字: “此数字的 ASCII 码” 与 “ 0 的 ASCII 码” 相减即可;
        数字拼接: 若从左向右遍历数字,设当前位字符为 c ,当前位数字为 x ,数字结果为 res ,则数字拼接公式为:
        res=10×res+x
        x=ascii(c)−ascii(′0′)

代码展示:

利用函数清空空格:

//时间1 ms击败100%
//内存41.3 MB击败59.83%
//时间复杂度 O(N): 其中 N 为字符串长度,线性遍历字符串占用O(N)时间。
//空间复杂度 O(N): 删除首尾空格后需建立新字符串,最差情况下占用O(N)额外空间。
class Solution {
    public int strToInt(String str) {
        char[] c = str.trim().toCharArray();

        if(c.length == 0){
            return 0;
        }

        int res = 0, bndry = Integer.MAX_VALUE / 10;
        int i = 1, sign = 1;
        if(c[0] == '-'){
            sign = -1;
        }else if(c[0] != '+') {
            i = 0;
        }

        for(int j = i; j < c.length; j++) {
            if(c[j] < '0' || c[j] > '9'){
                break;
            }
            if(res > bndry || res == bndry && c[j] > '7'){
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            res = res * 10 + (c[j] - '0');
        }

        return sign * res;
    }
}

如果不能使用函数:

既然不能使用函数了,肯定是先循环一下将位置调到第一个不为空格的字符下面。

//时间1 ms击败100%
//内存41.6 MB击败29.18%
class Solution {
    public int strToInt(String str) {
        int res = 0, bndry = Integer.MAX_VALUE / 10;

        int i = 0, sign = 1, length = str.length();

        if(length == 0){
            return 0;
        }

        while(str.charAt(i) == ' '){
            if(++i == length){
                return 0;
            }
        }
        
        if(str.charAt(i) == '-'){
            sign = -1;
        }

        if(str.charAt(i) == '-' || str.charAt(i) == '+') {
            i++;
        }

        for(int j = i; j < length; j++) {
            if(str.charAt(j) < '0' || str.charAt(j) > '9'){
                break;
            }

            if(res > bndry || res == bndry && str.charAt(j) > '7'){
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            res = res * 10 + (str.charAt(j) - '0');
        }

        return sign * res;
    }
}

 

posted @ 2023-02-01 15:30  忧愁的chafry  阅读(28)  评论(0编辑  收藏  举报