程序地带

【算法之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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45774485/article/details/112689300

随机推荐

Java面向对象——类、封装、this、构造方法

Java面向对象——类、封装、this、构造方法

目录 阐述举例说明面向对象思想特点this关键字的由来及使用封装的概述和好处private关键字的由来及使用成员变量和局部变量的区别对象的内存图原理Java中的类和现实中事物的对应关系课后作业阐述举例...

仙姝 阅读(784)

信息系统分析与设计杨选辉_信息系统分析与设计

本书是根据我国高等学校信息管理与信息系统本科专业核心课程信息系统分析与设计的教学大纲编写的。这门课程的教学目标是:在学生已经具备了计算机、网络、数据库等技术知识和有关的经济管理知识的基础...

羽一住 阅读(537)

jmeter 控制偏离_jmeter之监听器(十)

一、查看结果树察看结果树以树的形式显示了所有取样器的响应,您可以查看任何取样器的响应。性能测试时,不能使用察看结果树,因为它会消耗大量资源性能测试时ÿ...

weixin_39803977 阅读(853)