题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
+2147483647
1a33
输出
2147483647
0
这道题目逻辑较简单,但是明显考察的是各种边界条件、特殊用例。包括:
1、长度溢出
2、整型的上溢出与下溢出
3、非法字符(非数字字符)
4、带正负号的字符串
5、仅有正负号的字符
6、输入为null
7、空字符串""
下面是自己AC掉的代码,由于牛客讨论区未见到考虑周全代码,故不做整理
public class Solution {
public int StrToInt(String str) {
long result = 0;
//虽然使用long型保存result,最后进行截断得int,但即使是long甚至longlong都有可能溢出,
//所以必须对位数长度进行控制。int型的长度最多为10位,考虑到正负号取11位。
if(str.length() > 11 || str == null || str.length() == 0)
return 0;
//设置reallength来记录除了符号位以外的数字位数,当然也可以通过对符号为置'0'从而求和的时
//候直接使用str.length便可以,但java中String是不可变的,反而会更麻烦
int reallength = str.length();
int flag = 1;
int start = 0;
//判断是否存在符号位
if(str.charAt(0) == '+') {
flag = 1;
reallength--;
start = 1;
}
else if(str.charAt(0) == '-') {
flag = -1;
reallength--;
start = 1;
}
//判断非法字符
for(int i = start; i < reallength + start; i++) {
if(str.charAt(i) >= '0' && str.charAt(i) <= '9') {
result = result * 10 + str.charAt(i) - '0';
}
else
return 0;
}
result *= flag;
//判断整型的上溢出及下溢出,二者的绝对值不相等
if(result > Integer.MAX_VALUE || result < Integer.MIN_VALUE)
return 0;
else
return (int) result;
}
}
网友评论