被遗忘的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)