题目:
给定一个字符串 str,如果str符合日常书写的整数形式,并且属于 32 位整数的范围,返回 str 所代表的整数值,否则返回 0 。
举例:
str = "123" 返回 123
str = "023" 返回 23
str = "2147483647" 返回 2147483647
str = "2147483648" 返回0,因为溢出了
str = "-123" 返回 -123
思路:
检查是否合法:
public static boolean isValid(char[] chas) {
//排除不以符号和数字开头的
if (chas[0] != '-' && (chas[0] < '0' || chas[0] > '9')) {
return false;
}
//排除 ‘-’ 和 ‘-023’ 这种的
if (chas[0] == '-' && (chas.length == 1 || chas[1] == '0')) {
return false;
}
//排除以0开头的
if (chas[0] == '0' && chas.length > 1) {
return false;
}
//检查字符串其他位置是不是都是数字 如果有不是的返回 false
for (int i = 1; i < chas.length; i++ ) {
if (chas[i] < '0' || chas[i] > '9') {
return false;
}
}
return true;
}
如果str不符合日常书写的整数形式,根据题目要求,直接返回0即可。
如果符合,进行如下转换过程:
不管是正数还是负数,转换过程都以 负数的形式出现,然后根据前面的 '-' ,如果有负号,结果保持不变,如果没有'-',去掉结果前面的负号。
例如:
str = "123" 转换为结果时 -123,posi= true,最后返回 123
str = "-123" 转换为结果时 -123,posi= false,最后返回 -123
判断溢出问题:
public static int convert(String str) {
if (str == null || str.equals("")) {
return 0;
}
char[] chas = str.toCharArray();
if (!isValid(chas)) {
return 0;
}
boolean posi = chas[0] == '-' ? false : true;
int minq = Integer.MIN_VALUE / 10;
int minr = Integer.MAX_VALUE % 10;
int res = 0;
int cur = 0;
//如果是以 ‘-’ 开头,就从 1 位置遍历,如果不是,就从0位置开始遍历
for (int i = posi ? 0 : 1; i < chas.length; i++) {
//拿到当前字符的负数形式
cur = '0' - chas[i];
//判断是否溢出
if ((res < minq) || (res == minq && cur < minr)) {
return 0;
}
res = res * 10 + cur;
}
if(posi && res == Integer.MIN_VALUE) {
return 0;
}
return posi ? -res : res;
}