实现 atoi
,将字符串转为整数。
在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
若函数不能执行有效的转换,返回 0。
说明:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
package LeetCode;
public class A8字符串转整数 {
public int myAtoi(String str) {
Boolean notFirstChar = false; // 该字符不是第一次出现
Boolean notFirstZero = false; // 是不是左零
Boolean isNegtive = false; // 判断正负
Boolean hasNum = false; // 是否有数字
String numString = new String(); // 保存数字
for (int i = 0; i < str.length(); i++) {
if ((notFirstChar == false) && str.charAt(i) == ' ') { // 左做空格
System.out.println("跳过空格");
} else if ((notFirstChar == false) && str.charAt(i) == '+') { // 该正号是第一次出现
notFirstChar = true;
System.out.println("是正数");
} else if ((notFirstChar == false) && str.charAt(i) == '-') { // 该负号是第一次出现
notFirstChar = true;
System.out.println("是负数");
isNegtive = true;
} else if ((str.charAt(i) == '0') && (notFirstZero == false)) { // 0是左零
// System.out.println(str.charAt((i+1<str.length()-1)?(i+1):i));
if (i < str.length() - 1) {
if (isNumber(str.charAt(i + 1)) == false) {
System.out.println("这个0后面没有数字了,返回0");
return 0;
}
}
System.out.println("跳过左零");
} else if (isNumber(str.charAt(i))) { // 0不是左零
hasNum = true;
notFirstChar = true;
notFirstZero = true;
numString += str.charAt(i);
} else {
if (notFirstChar == false) {
return 0;
} else {
break;
}
}
}
if (isNegtive) { // 负数加上‘-’
numString = '-' + numString;
}
if (hasNum == false) {
return 0;
}
if (numString.length() > 12) {
if (numString.charAt(0) == '-') {
return Integer.MIN_VALUE;
} else {
return Integer.MAX_VALUE;
}
}
// System.out.println(numString);
Long numLong = Long.parseLong(numString);
if (numLong <= Integer.MAX_VALUE && numLong >= Integer.MIN_VALUE) {
System.out.println("合法范围");
return Integer.parseInt(numString);
} else if (numLong >= Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
} else {
return Integer.MIN_VALUE;
}
}
private boolean isNumber(char ch) {
// TODO Auto-generated method stub
if (ch >= '0' && ch <= '9') {
return true;
}
return false;
}
public static void main(String[] agrs) {
A8字符串转整数 a8字符串转整数 = new A8字符串转整数();
// String str = "20000000000000000000";
// String str = "+";
// String str = "-91283472332";
// String str = " 0000000000012345678";
// String str = " +0 123";
// String str =" -42";
// String str ="0-1";
// String str ="000000000000000000";
String str = "90";
System.out.println(a8字符串转整数.myAtoi(str));
}
}
这道题就是不断提交不断发现用例不满足不断修改代码的过程 = =。
几个常见的不容易满足的用例我写在main函数里了。