LeetCode-字符串转整数

Posted 陈嘉懿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode-字符串转整数相关的知识,希望对你有一定的参考价值。

LeetCode刷题笔记

LeetCode题库:https://leetcode-cn.com/problemset/all/

字符串转整数

给定字符串,将其转化成一个32位有符号整数

思路

字符串去除前导空格后,遍历字符串并根据以下条件依次判断字符串是否符合要求

  1. 判断字符串是否为单个非数字字符;
  2. 判断是否以数字或正负号开头;
  3. 判断除去正负号后是否以非数字符号开头。

最后获取截取的数字部分并判断大小,返回结果。

代码实现

var myAtoi = function(s) {
    if (s.length === 1 && isNaN(s) && s !== \' \') return 0; // 排除单个非数字字符

    s = s.replace(/^ */g, \'\'); // 去掉前导空格

    const condition = {
        \'+\': true,
        \'-\': false
    }

    /**
     * 判断第一个字符是否符合条件
     * 首先判断第一个字符是否为数字,是则返回true,反之再进一步判断
     * 判断字符是否为正负号,不是则赋值为undefined
     */
    var isPositive = isNaN(s[0]) ? condition[s[0]] : true;

    if (isPositive === undefined) return 0; // 不符合条件的字符返回 0

    s = s.slice(isNaN(s[0]) ? 1 : 0); // 除去正负号
    var end = 1; // 数字结束位置初始化

    // 遍历字符串
    for (let i = 0; i < s.length; i++) {
        end = i > end ? i : end; // 更新结束位置
        if (isNaN(s[i]) || s[i] === \' \') {
            if (i === 0) { // 排除去除正负号后仍以非数字字符开头的字符串
                return 0;
            } else {
                // 发现非数字字符,跳出循环
                break;
            }
        }
    }

    var result = parseInt(s.slice(0, end + 1)); // 截取数字部分
    result = isPositive ? result : -result; // 改变数字正负

    // 判断结果是否超出区间
    if (isPositive) {
        result = result > Math.pow(2, 31) - 1 ? Math.pow(2, 31) - 1 : result;
    } else {
        result = result < Math.pow(-2, 31) ? Math.pow(-2, 31) : result;
    }

    return result;
};

运行结果

执行用时 内存消耗
104 ms 39.4 MB

以上是关于LeetCode-字符串转整数的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 13. 罗马数字转整数

LeetCode-字符串转整数

LeetCode 12 整数转罗马数字[硬编码 数学 找规律] HERODING的LeetCode之路

leetcode-字符串转整数(atoi)

leetcode 8 字符串转整数

leetcode-13罗马字符转整数