【算法】字符串:字符串转换整数 |【掘金日新计划·12月更文挑战】

107 阅读3分钟

题目:字符串转换整数

leetCode链接:字符串转换整数

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

函数 myAtoi(string s) 的算法如下:

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

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

理解:

1、有一个可能包含空格,+-号,字母,数字等的字符串,将它转换成一个32位有符号的整数

2、去除或忽略字符串空格

3、字符数值部分前面不能有多个符号位,否则返回0

4、字符不能只有符号位,空格或者字符,否则返回0

5、保留字符中数值前必要的符号位

6、得到的数值不能大于2的31次方减1,也不能小于-2的31次方

思路:

1、借助JS的parseInt API完成数值的转换,它有如下特点:

  • 无视开头空格(√)
  • 返回有符号整数(√)
  • 无视整数部分后的字符(√)
  • 范围在32位内(含)(x)
  • 其他情况返回0(x)

返回值: 如果被解析参数的第一个字符无法被转化成数值类型,则返回NaN。

2、字符判断,将不满足格式的字符串返回0,最终返回所需的数值

题解:

/**
 * @param {string} s
 * @return {number}
 */
var myAtoi = function(s) {
    const number = parseInt(s, 10);

    if(isNaN(number)) {
        return 0;
    } else if (number < Math.pow(-2, 31) || number > Math.pow(2, 31) - 1) {
        return number < Math.pow(-2, 31) ? Math.pow(-2, 31) : Math.pow(2, 31) - 1;
    } else {
        return number;
    }
};

image.png

总结:

本篇提供了下字符串转换整数的实现,在给出的方案中,代码比较简单,但是刚开始要联系上该API,如果不了解,可能还有点难度,毕竟题目涉及的各种可能测试失败的符号比较多,偏偏这个API都完美的处理掉了,至于思路2,虽然有想法了,但是在写代码过程中,还是碰到点问题,鉴于时间问题,暂时不再继续深究,后续再补上吧,给自己加个TODO。