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
posted @ 2021-06-04 21:53  陈嘉懿  阅读(78)  评论(0编辑  收藏  举报