剑指Offer 67、把字符串转换成整数

95 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

题目:要求编写一个函数strToInt,实现字符串转换成整数这个功能。

具体要求如下:

  1. 字符串可能包含无用的空格等,要求函数从第一个非空格字符开始。
  2. 第一个字符只能是'+'或者'-'或者是数字,若非这三个则直接返回0
  3. 除了有效整数部分其余部分应该被忽略,如果函数不能进行有效转换则直接返回0。
  4. 要求存储环境只能存储32位大小有效数字,即[2312311][-2^{31}-2^{31}-1]。如果超出此范围则直接返回最大值或者最小值。

解题思路

本题是一道中等题,读完题目感觉不是很难,但最终通过率只有29%。让我们一起来看看本题吧。

首先消除无用的空格,这可以用Java内置的函数trim,如果不用也可以一步步遍历,遇到空格继续,直到判断到起始索引即可。

第二步是判断起始索引是否是符号,如果是正号则最终返回得到的结果,如果是符号则将最终结果乘以-1即可,并且Java内置函数Character.isDigit可以判断字符是否是数字,如果不是也可以直接返回0。

第三步是开始遍历字符串,但此处需要注意的是起始元素可能是数字也可能是符号,如果是符号则索引后移,如果是数字则不变,这里我们可以假设初始时是符号,之后判断起始索引是否是数字,如果是则将索引恢复即可。

本题的难点是如果数字越界如何处理,因为每次得到的数字都是通过将已有的数字*10再加上对应索引的字符,因此判断是否越界就判断当前结果是否已经大于数值最大值/10,如果大于则结果肯定越界,直接返回即可。但存在等于的情况,此时需要判断当前字符是否大于7,如果小于则不会越界,否则也必定越界。

根据上述思路,可得代码如下:

public int strToInt(String str) {
    str = str.trim();
    if(str.length()==0) return 0;
    if(str.charAt(0)=='+'||str.charAt(0)=='-'||Character.isDigit(str.charAt(0))){
        int sign = 1, index = 1;
        if(str.charAt(0)=='-'){
            sign = -1;
        }
        if(Character.isDigit(str.charAt(0))){
            index = 0;
        }
        int res = 0;
        for(int i=index;i<str.length();i++){
            if(str.charAt(i)<'0'||str.charAt(i)>'9') break;
            if(res>Integer.MAX_VALUE/10||(res==Integer.MAX_VALUE/10&&str.charAt(i)>'7')) return sign==1?Integer.MAX_VALUE:Integer.MIN_VALUE;
            res = res*10 + (str.charAt(i)-'0');
        }
        return sign * res;
    }
    return 0;
}