一、题目描述

二、题目思路
分析转化规则
- 首先,保证丢弃无用的开头空格字符
- 其次,判断第一个非空字符是
'+'还是'-',或者是数字还是字母(无效转换) - 然后,保证丢弃字符串有效整数部分后的多余字符
- 最后,转化过程中,注意数值范围为
[-2^31,2^31-1]
三、题目代码
class Solution {
public int myAtoi(String str) {
int i =0;
if(i == str.length()){
return 0;
}
while(str.charAt(i)==' '){
i++;
if(i == str.length()){
return 0;
}
}
String newStr = str.substring(i);
StringBuilder sb = new StringBuilder();
int negative =1;
if(newStr.charAt(0)=='-'){
sb.append('-');
negative =-1;
}else if(newStr.charAt(0)=='+'){
}else if(Character.isDigit(newStr.charAt(0))){
sb.append(newStr.charAt(0));
}else{
return 0;
}
for(int j=1;j<newStr.length();j++){
if(!Character.isDigit(newStr.charAt(j))){
break;
}
sb.append(newStr.charAt(j));
}
if(sb.toString().equals("-")||sb.toString().equals("")){
return 0;
}
int result =0;
int k = 0;
if(Character.isDigit(sb.charAt(0))){
result = (int)sb.charAt(0)-(int)'0';
k = 1;
}else {
result = -1*((int)sb.charAt(1)-(int)'0');
k =2;
}
while(k<sb.length()){
if(result > Integer.MAX_VALUE/10 ||(result == Integer.MAX_VALUE/10 &&((int)sb.charAt(k)-(int)'0' > Integer.MAX_VALUE%10 ))){
return Integer.MAX_VALUE;
}
if(result < Integer.MIN_VALUE/10 ||(result == Integer.MIN_VALUE/10 &&((int)sb.charAt(k)-(int)'0'>-1*(Integer.MIN_VALUE%10)))){
return Integer.MIN_VALUE;
}
result = result*10 + negative * ((int)sb.charAt(k) - (int)'0');
k++;
}
return result;
}
}
四、存在的问题
1. 首先对输入的字符串进行处理的问题
a.判断出空格即索引跳过,在
while(){}循环中会遇到 输入字符串为" " 的情况(提示索引越界错误):因此要在循环中增加if(i == str.length())判断语句
b.对特殊情况:输入空字符串
""的处理:if(str.length()==0)判断
针对以上a和b两种情况,可以优化代码如下
int i =0;
while(i<str.length() && str.charAt(i)==" "){
i++;
}
if(i == str.length()){
return 0;
}
2. 然后,对字符串的符号以及是否字母开头进行判断
StringBuilder sb = new StringBuilder();
int negative =1;
if(newStr.charAt(0)=='-'){
sb.append('-');
negative =-1;
}else if(newStr.charAt(0)=='+'){
}else if(Character.isDigit(newStr.charAt(0))){
sb.append(newStr.charAt(0));
}else{
return 0;
}
for(int j=1;j<newStr.length();j++){
if(!Character.isDigit(newStr.charAt(j))){
break;
}
sb.append(newStr.charAt(j));
}
a.判断第一位字符,存在
'+','-',0-9,a-z四种情况,如果是'+',不需要加字符
b.在字符串中继续扩展字符,如果是字母则结束
c. 对于a提到的四种情况:sb剩下
''(newStr为'+'的情况),'-',不带符号的正整数,负整数四种情况
3. 最后是对sb进行越界确认以及转化为整数
a.对于数字转化
result = result*10 + negative * ((int)sb.charAt(k) - (int)'0');
negative的意义在于转化的数字如果是负数,需要减操作,而不是加操作
b.同样,判断是否小于最小值的时候,需要注意字符串的数字位无符号
五、其他思路
其他优解中省略了构建StringBuilder的过程,即在转化整数的过程中判断当前字符是否为数字