题目
提示:
本题中的空白字符只包括空格字符 ’ ’ 。
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
示例 1:
输入: “42”
输出: 42
示例 2:
输入: " -42"
输出: -42
解释: 第一个非空白字符为 ‘-’, 它是一个负号。
我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:
输入: “4193 with words”
输出: 4193
解释: 转换截止于数字 ‘3’ ,因为它的下一个字符不为数字。
示例 4:
输入: “words and 987”
输出: 0
解释: 第一个非空字符是 ‘w’, 但它不是数字或正、负号。
因此无法执行有效的转换。
示例 5:
输入: “-91283472332”
输出: -2147483648
解释: 数字 “-91283472332” 超过 32 位有符号整数范围。
因此返回 INT_MIN (−231) 。
通过次数195,723提交次数938,532
1、直接思维——字符串正则匹配
class Solution {
public int myAtoi(String str) {
str=str.stripLeading();//去除首部空格
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("^[+|-]?\\d+");//\是转义字符,需要\\表示
java.util.regex.Matcher matcher = pattern.matcher(str);
//System.out.println(str.matches("^[+|-]?\\d+"));
if(matcher.lookingAt()){//匹配成功,lookingAt()部分匹配,matches()是全部匹配
str = str.substring(0,matcher.end());
int res;
int Limit = Integer.MAX_VALUE;
try{
if(str.charAt(0)=='-'){//是负数,可能越界值为 Integer.MIN_VALUE
Limit = Integer.MIN_VALUE;
}//否则为正数
res = Integer.parseInt(str);
}catch (NumberFormatException e){
res = Limit;
}
return res;
}else
return 0;
}
}
一次accept,效率感人。估计是引用了类库的问题。
2、非要自己造轮子的话
class Solution {
public int myAtoi(String str) {
//下面自己造轮子
char[] chars = str.toCharArray();
int start=-1;
int flag=1;//判断是否为正数
for (int i = 0; i < chars.length; i++) {//最多判断n次,就是全部是空格
if(chars[i]==' '){//空格忽略
continue;
}
if(chars[i]=='+'){//整数
start = i;
break;
}
if(chars[i]=='-'){//负数
start = i;
flag= -1;//只有这里可能是负数
break;
}
if(!Character.isDigit(chars[i])){//不是数字或者+,-号开头则直接退出
return 0;
}
if(Character.isDigit(chars[i])){//数字开头
start = i;
break;
}
}
if(start<0)
return 0;//全是空格
if(chars[start]=='-'||chars[start]=='+') {
start = start+1;
}
//也就是现在的start要么指向的是数字,要么指向的是符合
int res=0;
for(int i=start;i<chars.length;i++){
if(Character.isDigit(chars[i])){//是数字则可以进行转化
int pop = flag*(chars[i]-'0');
//判断是否越界
if (res > Integer.MAX_VALUE/10 || (res == Integer.MAX_VALUE / 10 && pop > 7))
return Integer.MAX_VALUE;
if (res < Integer.MIN_VALUE/10 || (res == Integer.MIN_VALUE / 10 && pop < -8))
return Integer.MIN_VALUE;
res = res*10+pop;//需要放后边,因为我们是先判断/10合要求了,那么它*10才会符合要求
}else
break;
}
return res;
}
}
果然不出我所料:牛皮!