字符串转整数

时间:2020-12-30 22:12:14

字符串转整数,也是一个经典的问题了。字符串转整数本身的逻辑很简单,难就难在各种特殊输入与特殊情况。所以,这不是一道考察算法的题,而是一道考察细节与编码习惯的题。

我们考虑如下特殊情况:
1.输入为null或者为空字符串。
2.输入开头带空格的字符串。
3.输入带有正负号的数字。
4.数值范围超出最大正整数或者最小负整数。

package edu.bit.algorithm;

public class IntergerToString {

public static void main(String[] args) {
String rawstr = null;
int result = atoi(rawstr);
System.out.println("The result is: " + result);

rawstr = "+123";
result = atoi(rawstr);
System.out.println("The result is: " + result);

rawstr = " -123";
result = atoi(rawstr);
System.out.println("The result is: " + result);

rawstr = " +12ab3";
result = atoi(rawstr);
System.out.println("The result is: " + result);

rawstr = "34567123456";
result = atoi(rawstr);
System.out.println("The result is: " + result);

}

public static int atoi(String rawstr) {
//字符串为空
if (rawstr == null || rawstr.length() == 0) {
System.out.println("The rawstr is null!");
return 0;
}

int start = 0; //找不是空格的位置
boolean positive = true; //默认为正数

//找第一个不是空格的位置
if (rawstr.charAt(start) == ' ') {
while(rawstr.charAt(start) == ' ') {
start++;
if(start == rawstr.length()) {
System.out.println("The rawstr is all of space!");
return 0;
}
}
}

//判断是否带符号
if(rawstr.charAt(start) == '-') {
positive = false;
start++;
} else if(rawstr.charAt(start) == '+') {
start++;
} else if(rawstr.charAt(start) >= '0' && rawstr.charAt(start) <= '9') {
return transfer_num(rawstr,start,true);
} else {
System.out.println("Invalid string to Int: " + rawstr);
return 0;
}

//此时只有'+'或者'-'
if(start == rawstr.length()) {
return 0;
}

//此时为" -abc这种形式的字符串"
if(rawstr.charAt(start) <= '0' && rawstr.charAt(start) >= '9') {
System.out.println("Invalid string to Int: " + rawstr);
return 0;
} else { //为" +123"这种形式的字符串
return transfer_num(rawstr,start,positive);
}
}

public static int transfer_num(String rawstr, int start, boolean positive) {
long result = 0;

for(int i= start; i<rawstr.length(); i++) {
if(rawstr.charAt(i) >= '0' && rawstr.charAt(i) <= '9') {
result = result * 10 + (rawstr.charAt(i) - '0');
} else {
System.out.println("Invalid string to Int: " + rawstr);
return 0;
}
}

if(positive) {
if(result > Integer.MAX_VALUE) {
System.out.println("The result bigger than MAX_VALUE!");
return Integer.MAX_VALUE;
} else {
return (int) result;
}
} else {
if(result < Integer.MIN_VALUE) {
System.out.println("The result less than MIN_VALUE!");
return Integer.MIN_VALUE;
} else {
return (int) -result;
}
}
}
}

将代码run起来

The rawstr is null!
The result is: 0
The result is: 123
The result is: -123
Invalid string to Int: +12ab3
The result is: 0
The result bigger than MAX_VALUE!
The result is: 2147483647

再来一个版本

/**
* 1.null or empty string
* 2.white spaces
* 3.+/- sign
* 4.calculate real value
* 5.handle min and max
*/


public class StringToInt {

public static int atoi(String str) {
if(str == null || str.length() < 1) {
return 0;
}

str = str.trim(); //去除空白字符
char flag = '+';

int i = 0;
if (str.charAt(0) == '-') {
flag = '-';
i++;
} else if(str.charAt(0) == '+') {
i++;
}

double result = 0;

for(int j=i; j<str.length(); j++) {
if(str.charAt(j) >= '0' && str.charAt(j) <= '9') {
result = result * 10 + (str.charAt(j) - '0');
} else {
return 0;
}
}

if(flag == '-') {
result = -result;
}

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

return (int) result;
}

public static void main(String[] args) {
String str = " 123";
System.out.println(atoi(str));

str = " -1134";
System.out.println(atoi(str));

str = " 123abc6";
System.out.println(atoi(str));
}

}