题目描述
实现一个将字符串转化为一个整数的函数
思考过程
- 先考虑都会有什么可能的输入情况
1.1 合法输入,如:“213”,“+1”,“0”,“-3”
1.2 非法输入,如小数:“1.2”;分数:“3/2”;字符:“abc”,“a1”,“1a”;空字符:“ asdfa fasdfgdfg” - 所以应当先判断输入是否合法,非法则不执行转换
- int:max=2147483647,min=-2147483648
字符串相关函数:
- length():字符串长度
- indexOf()、lastIndexOf():确定字符串位置
- equals():字符串比较
- charAt():得到指定位置的字符
- getChars():得到字符串的一部分字符串
- subString():提取字符串的另一种方法,它可以指定从何处开始提取字符串以及何处结束
- replace():将字符串中的一个字符替换为另一个字符
- concat():把两个字符串合并为一个字符串
- toUpperCase()和toLowerCase():分别实现字符串大小写的转换
- trim():将字符串中开头和结尾处的空格去掉(本题适用)
- valueOf():将任何类型的数据对象转换为一个字符串
- append():在字符串后面追加
- insert():在字符串中间插入
- setCharAt():改变某个位置所在的字符
- 查看更多java字符串操作…
char和int的转换:
- int 转换成char:
int n = 1;
char ch = (char)(n + '0');
这样打印出来ch的值为1;
不过需要注意(因为char只有一个字节),此处的n只能是0-9之间的字符
- char转int:
char ch = '9';
int n = int(ch) - int('0');
此处ch也是‘0’至‘9’的数字字符
遇到的问题:
-
char转换string?
答:""+char即可转为string -
char转换int?
答:见上面 -
如何匹配0-9数字?
答:可以使用正则表达式,设置模板进行匹配,如:
String reg="0|1|2|3|4|5|6|7|8|9";
Pattern p=Pattern.compile(reg);
Matcher m=p.matcher(str);
boolean result=m.find();
如果字符串不是合法int类型,应该return什么?
答:有多少是合法的就输出多少合法的,尽可能的解析对于超出int上下限的数值如何处理?
答:截断处理,即超出范围的均输出最大或者最小值如何获得int的最大最小值?
答:Integer.MAX_VALUE和Integer.MIN_VALUE
提交状态:
- Runtime Error
原因:没有考虑到输入字符串为空的情况
解决方法:
if(len==0){
return 0;
}
- Wrong Answer
原因:对于类似的不合法字符串,期待输出是尽可能的解析,自己的理解不到位,对于不合法字符串都输出了0
Input:" -0012a42"
Output:0
Expected:-12
解决方法:修改return,尽可能解析
- Wrong Answer
原因:int上下限没有处理
Input:"2147483648"
Output:-2147483648
Expected:2147483647
解决方法:将result类型由int转为long,并在return之前进行数值大小是否溢出的判断
long result=0;
...
if(PandN==1 && result>2147483647){
return 2147483647;
}else if(PandN==(-1) && -1*result<-2147483648){
return -2147483648;
}else{
return PandN*(int)result;
}
- Wrong Answer
原因:上次考虑了int上下溢出的问题,但是没有考虑long上下溢出的问题
Input:"9223372036854775809"
Output:1
Expected:2147483647
解决方法:将判断尺寸语句内置在每次循环中,实时判定,只要超出int范围,立即截断输出
- Accepted