【算法之LeetCode系列(2)】—— 字符串转整数

被遗忘的parseInt()崩了我的四个小时(力扣第八题)

这道题其实真的很简单,主要是距离学习parseInt()这个方法时间太久,而且期间基本没怎么去做js相关的题,所以以至于最后用笨办法做出来了,但是时间也浪费了,所以总结一下,不管怎么样,学啥都要一直练习,不要因为各种事就放弃练习,淦 !

原题目的意思是写一个函数,实现任意输入一个字符串,将其转换成正确的整数,该函数会自动忽略字符串开头无效的空格,直到找到第一个非空格字符,否则返回0:
  • 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。

  • 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。

  • 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。

  • 注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。

  • 在任何情况下,若函数不能进行有效的转换时,请返回 0 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-to-integer-atoi

话不多说,先看我的代码,非常丑陋,大家尽管喷,自己都想骂自己:

var myAtoi = function(s) {
    var len = s.length,
        temp = [0],
        result = 0,
        flag = -1,
        num = -1,
        shikongge = -1;
    for(var i = 0; i < len; i ++){
        var uni = s.charCodeAt(i);
        if(s == ' '){
            return 0;
        }else if(uni == 32){
            if(num == 0 || flag == 0) break;
            temp[i] = [0,true];
        }else if(uni >= 48 && uni <= 57){
            temp[i] = s[i];
            num = 0;
        }else if(uni == 43 || uni == 45){
            if(flag == -1){
                if(num == -1){
               temp[i] = s[i];
               flag = 0;
            }else{
                break;
            }
            }else{
                break;
            }
        }else if(uni < 48 || uni > 57){
            break;
        }else if(num == 0){
            break;
        }
    }
    if(temp.length == 1 && temp[0] == 0){
        return 0;
    }else{
                temp = temp.filter(function (e){
                    return typeof(e) != "object";
                });
        
    }
    var str = temp.join(''); 
    for(var i = 0;i < str.length; i ++){
        var s1 = str.charCodeAt(i);
        if(s1 == 43 ||s1 == 45){
            continue;
        }else{
            result += Math.pow(10,str.length - 1 - i) * str[i];
        }
    }
    console.log(str);
    if(str.length == 1 && str[0] == '-' || str.length == 1 && str[0] == '+'){
        return 0;
    }else if(str >= 2147483648){
        return 2147483647;
    }else if(str < -2147483648){
        return -2147483648;
    }else{
        return str;
    }
    
};

相信大家看到这么多if else就知道为什么我用了四个小时,且非常想骂自己了……

看完力扣题解里面的方法之后,深深感受到自己JavaScript基础部分忘得多快,官方解答里面有自动机这种解法,但是这里不做介绍,想了解可移步JavaScript版自动机解法

既然是parseInt让我崩溃,那就先来介绍一下parseInt()方法:

parseInt()方法主要有两个作用:
  • parseInt()括号中可以传两个参数,第一个参数是一个数字,后面一个参数是这个数字的进制,比如parseInt(10,16);意思就是这个10是16进制的,这个16进制的10经过parseInt()方法的转换就会自动转换成十进制的数,并返回这个十进制的数,

  • 第二个作用是可以将一个带数字的字符串转换成一个正确的整数,并且返回这个整数,且字符串的要求是数字必须在前面,一旦遇到不是数字的字符,如小数点或者空格,或者英文字母,就会停止转换,例如全字母的,或者是true、undefined等等一系列其他字符时,就会自动转换成NaN,并且会自动忽略字符串前面的无效空格。

讲完parseInt()的作用,我相信大家内心已经有了解决办法,话不多说,看大佬的代码:

var myAtoi = function(str) {
const number = parseInt(str, 10);

if(isNaN(number)) {    //因为要满足其他情况返回0,所以这里加一个判断,如果是NaN就返回0
    return 0;
} else if (number < Math.pow(-2, 31) || number > Math.pow(2, 31) - 1) {
//因为满足转换后的数字,必须在32位内,所以加上这个判断
    return number < Math.pow(-2, 31) ? Math.pow(-2, 31) : Math.pow(2, 31) - 1;
} else {
    return number;
}

};

作者:gatsby-23
链接:https://leetcode-cn.com/problems/string-to-integer-atoi/solution/javascripttou-ji-qu-qiao-wu-xu-si-kao-yi-kan-jiu-h/
来源:力扣(LeetCode)

总结:不管什么方法,不去用,也许你刚记完就会忘,多用多练最nice

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

summer·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值