LeetCode 8.字符串转换整数

449 阅读2分钟

一、题目详情

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:

  • 读入字符串并丢弃无用的前导空格
  • 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
  • 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  • 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
  • 如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
  • 返回整数作为最终结果。

注意:

  • 本题中的空白字符只包括空格字符 ' ' 。
  • 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

示例:

输入:s = "42"
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
第 1 步:"42"(当前没有读入字符,因为没有前导空格)
         ^
第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
         ^
第 3 步:"42"(读入 "42")
         ^
解析得到整数 42 。
由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42

二、思路

其实题目中函数的算法已经描述得很详细,我们只要根据算法一步步来,就可以了。 想将字符串转换为整数,我们首先得获取这个整数的最高位在字符串中的位置,然后不断读入数字,直到下一个非数字或者字符串读完为止。

三、代码

public int myAtoi(String str) {
    char[] charArr=str.toCharArray();
    Long result=0L;
    int startIndex=0;
    boolean flag=true;
    int length=0;//整数的长度
    //获取最高位数字在字符串中的索引位置
    for(int i=0;i<charArr.length;i++) {
        if(charArr[i]==' ') {
            startIndex++;
            continue;
        }
        if(charArr[i]=='+') {
            flag=true;
            startIndex++;
            break;
        }
        if(charArr[i]=='-') {
            flag=false;
            startIndex++;
            break;
        }
        break;
    }
    //把最高位的零都去掉
    while(startIndex<charArr.length) {
        if(charArr[startIndex]=='0')
            startIndex++;
        else 
            break;
    }

    //不断地读入数字
    for(int j=startIndex;j<charArr.length;j++) {
        if(charArr[j]>='0'&&charArr[j]<='9') {
            length++;
            result=result*10+(charArr[j]-'0');//这段数字的值
            if(length>10) {//32位int的最大值是10位数
                break;
            }
        }else {
            break;
        }
    }
    if(flag) {
        if(result>Integer.MAX_VALUE){
            return Integer.MAX_VALUE;
        }
    }else {
        result=-result;
        if(result<Integer.MIN_VALUE) {
            return Integer.MIN_VALUE;
        }
    }
    return result.intValue();
}

qrcode2.png