LeetCode 解题报告 - 8. String to Integer (atoi)

尼玛,我要被这道题的题目搞死了... 2016/10/12
编程语言是 Java,代码托管在我的 GitHub 上,包括测试用例。欢迎各种批评指正!


题目 —— String to Integer (atoi)

Implement atoi to convert a string to an integer.

Requirements for atoi:
The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value.
The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.
If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.
If no valid conversion could be performed, a zero value is returned. If the correct value is out of the range os representable values, INT_MAX (2147483647) or INT_MIN (-2147483648) is returned.


解答

  • 题目大意
    实现 atoi:将一个字符串转化为整数。

    atoi 的要求(这个要求搞死我了。。。):

    • 首先丢弃所有的空字符,直到找到第一个非空字符。然后,从这个字符开始,取出一个可选的初始正负号(正号或者负号),然后将剩下的部分转化为数值。
    • 这个字符串可能在构成整数的所有数后面附加一些字符,我们直接忽视这些字符就好,也就是说,它们不会对我们这个函数产生影响。
    • 如果这个字符串中的第一个非空字符串不是一个有效的数字,或者这样的非空字符串不存在,则不会产生转换为数字的行为。
    • 如果没有有效的转换行为存在,那么就返回 0。如果即将返回的值溢出了,那么返回 INT_MAX 或者 INT_MIN。
  • 解题思路
    一个需求一个需求地实现。。。判断溢出的时候稍微有点绕。

    • 注意这种把整数按位处理的一般就是 *10 或者 /10。
    • 这里正负号处理的逻辑还是有点巧妙的,存到 sign 这个变量中,最后乘上结果。
  • 代码实现

public class Solution {
    public int myAtoi(String str) {
        if (str.length() == 0) return 0;
        
        int i = 0, result = 0, sign = 1;
        // 跳过空字符
        while (i < str.length() && str.charAt(i) == ' ') {
            i++;
        }
        // 获取符号位
        if (str.charAt(i) == '+' || str.charAt(i) == '-') {
            sign = (str.charAt(i) == '+') ? 1 : -1;
            i++;
        }
        // 判断其他情况
        while (i < str.length()) {
            int digit = str.charAt(i) - '0';
            if (digit < 0 || digit > 9) break;
            if (Integer.MAX_VALUE/10 < result || Integer.MAX_VALUE/10 == result && Integer.MAX_VALUE % 10 < digit) {
                return (sign == 1) ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            result = result * 10 + digit;
            i++;
        }
        return result * sign;
    }
}
  • 小结
    这个题目不难,但是太长太难读了啊...读了好几遍才读懂每一句的意思。不知道翻译的你们能看懂不?记得判断空串,然后就是处理符号位,要耐心、仔细。

你可能感兴趣的:(LeetCode 解题报告 - 8. String to Integer (atoi))