String to Integer II

题目:

mplement function atoi to convert a string to an integer.

If no valid conversion could be performed, a zero value is returned.

If the correct value is out of the range of representable values, INT_MAX (2147483647) or INT_MIN (-2147483648) is returned.

"10" => 10
"-1" => -1
"123123123123123" => 2147483647
"1.0" => 1

分析:

这道题目的难点在于怎么考虑到所有可能的情况

首先确定一点,atoi的behavior是什么?

如果输入“    512fneowngp   ”返回值是512
如果输入”3.1415fwefwefwef111“返回值是3

然后开始研究逻辑

1. 判断字符串是否为空
2. 取消掉字符串中的所有空格,用String.trim()
3. 判断第一位是否为'+'或者'-'
4. 循环每一位
  4.1 判断是否有小数点'.'出现
  4.2 判断是否每一位都属于[0 ~ 9]
  4.3 当长度超过14时候,跳出循环,避免超长字符串的事儿
  4.4 更新,记录当前的数字是多少
5. 如果前面是negative,加符号
6. 判断是否超过INT_MAX或者INT_MIN

解法:

public class Solution {
    /**
     * @param str: A string
     * @return An integer
     */
    public int atoi(String str) {
        // write your code here
        if (str == null || str.length() == 0) {
            return 0;
        }
        str = str.trim(); // erase white space
        boolean flag = true;
        int start = 0; // check start digit for '+' or '-'
        if (str.charAt(0) == '+') { // 注意访问string中的某个digit的方法
            start++;
        } else if (str.charAt(0) == '-') {
            flag = false;
            start++;
        }

        long number = 0; // use long in case its out of bound
        for (int i = start; i < str.length(); i++) {
            if (str.charAt(i) == '.') { // check float number
                break;
            }
            if (str.charAt(i) > '9' || str.charAt(i) < '0') {
                break; // if "52lllle" return 52
            }
            if (i > 14) { // if string is too long
                break;
            }
            number = number * 10 + (str.charAt(i) - '0');
        }

        if (flag == false) {
            number = -number;
        }

        if (number > Integer.MAX_VALUE) {
            return Integer.MAX_VALUE;
        }
        if (number < Integer.MIN_VALUE) {
            return Integer.MIN_VALUE;
        }

        return (int) number;
    }
}

results matching ""

    No results matching ""