每日一题-字符串 leetcode8

225 阅读2分钟

一、题目描述

二、题目思路

分析转化规则

  1. 首先,保证丢弃无用的开头空格字符
  2. 其次,判断第一个非空字符是'+'还是'-',或者是数字还是字母(无效转换)
  3. 然后,保证丢弃字符串有效整数部分后的多余字符
  4. 最后,转化过程中,注意数值范围为[-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的过程,即在转化整数的过程中判断当前字符是否为数字