LeetCode 8 String to Integer (Tag:Sting Difficulty:Medium)

227 阅读2分钟

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

前言

关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!

题目描述

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

示例 1:
输入:s = "42"
输出:42

示例 2:
输入:s = " -42"
输出:-42

示例 3:
输入:s = "4193 with words"
输出:4193

示例 4:
输入:s = "words and 987"
输出:0

示例 5:
输入:s = "-91283472332"
输出:-2147483648
解释:解析得到整数 -91283472332。由于 -91283472332 小于范围 [-2^31, 2^31 - 1] 的下界,最终结果被截断为 -2^31 = -2147483648 。

链接:leetcode-cn.com/problems/st…

题解

这道题就是将字符串转换为数字。要对字符串做下面的处理:

  1. 字符串开头可能会有多个空白字符 ' ',所以要判断开头的字符,去除空白字符
  2. 除去空白字符外,字符串可能以 '+', '-' 开始,所以要判断这两个字符是否存在
  3. 字符串中不一定全是数字,要取出前面的数字部分,如果是以非数字开头则返回 0
  4. 最后返回的数字必须在 [-2^31, 2^31 - 1] 范围内,否则返回对应的上下边界。

搞清楚以上几个条件之后,我们只需要用一个下标变量 i,来依次判断每个字符,用 flag 来记录正负。具体代码如下,时间复杂度 O(n)。

/**
 * @param {string} s
 * @return {number}
 */
var myAtoi = function(s) {
    let ans = ''
    let i = 0
    let n = s.length
    let flag = 1
    
    // 删除前面的空白字符
    while ( i < n && s[i] === ' ') {
        i++
    }
    
    //判断符号
    if (s[i] === '-')  {
        flag = -1
        i++
    } else if (s[i] === '+') {
        i++
    }
    
    // 判断数字
    while ( i < n && isNumber(s[i])) {
        ans = ans * 10 + Number(s[i]) 
        i++
    }
    
    // 不是数字
    if (ans === '') {
        return 0
    } 
    
    ans = ans * flag
    
    // 判断范围
    const min = - Math.pow(2, 31)
    const max = Math.pow(2, 31) - 1
    if (ans < min) {
        return min
    }
    if (ans > max) {
        return max
    }
    return ans
    
};


var isNumber = (x) => {
    return x >= '0' && x <= '9'
}