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;
}
}