
将算法题记录下来,方便自己查看和复习,练习自己的思维。大家看到后,如果有好的思路和想法,可以留言哦,向大神们学习!
越努力,越幸运!加油!
整数反转
题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
书写思路
-
判断输入的数字是否大于0,大于零则进行第二步,否则进行第三步。
-
将输入的数据转换成字符串,利用split()将这一串字符串转换成数组,利用reverse()方法进行数组元素反转,在转换成整数。
-
将输入的数据转换成字符串,利用split()将这一串字符串转换成数组,利用reverse()方法进行数组元素反转,在转换成负整数。
-
这个整数反转好之后,在进行范围判断,如果超出范围,则返回0,反之返回反转之后的整数。
代码编写
起初的写法:
var reverse = function(x) {
let num = x;
var reNum = num.toString().split('').reverse().join('');
var intNum = parseInt(reNum);
if(intNum >= 0 && intNum <2^31 -1){
return intNum;
}
else if(intNum < 0 && intNum > -2^31){
return intNum;
}
else{
return 0;
}
};
提交代码,运行出错。负整数的执行结果是错的。没有考虑到负数的符号反转后放在了后面。

再次编写代码,运行成功,但是用时比较长:
var reverse = function(x) {
var reNum = 0;
let num = x;
let ss = num.toString().split('');
if(num < 0 ){
ss.shift();//shift()删除数组的第一个元素,并返回该元素,改变了原来的数组
reNum = -ss.reverse().join('');
}else{
reNum = ss.reverse().join('');
}
if( reNum >= 0 && reNum < 2147483647){
return reNum;
}else if(reNum< 0 && reNum > -2147483648){
return reNum;
}
else{
return 0;
}
};
对代码进行改进了一下,用时100ms。
var reverse = function(x) {
let num = x > 0 ? Number.parseInt(x.toString().split('').reverse().join('')) : Number.parseInt('-'+ x.toString().split('').reverse().join(''));
num = num > (2**31)-1 || num < (-2)**31 ? 0 : num;
return num ;
};
这部分代码是参考力扣上某个朋友写的,但是我对他写的代码里的slice(0)有一些疑问,我没有用这个slice(0)也可以实现。有想法的朋友可以下你的想法哦。
如下是那位朋友写的代码:
var reverse = function(x) {
let re=x>=0 ? Number.parseInt(x.toString().split('').reverse().join('')) : Number.parseInt('-'+x.toString().split('').reverse().join('').slice(0))
re=re<(-2)**31 || re>(2**31)-1 ? 0 : re
return re;
};
这位朋友对于负整数反转用到了slice(0),我查了一下关于JS的slice()方法,知识点如下:
slice的定义和方法:
slice() 方法可从已有的数组中返回选定的元素。
语法
arrayObject.slice(start,end)
start 必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
end 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。
eg:
var arr = ["George","John","Thomas","James","Adrew","Martin"];
console.log(arr.slice(2,4));
//Thomas,James
slice(0)是浅拷贝,可以将类数组转换成数组。
var obj = [
{
name:'keai',
job:'qqq'
},
{
name:'qingxin',
job:'www'
},
{
name:'nihao',
job:'eee'
}
];
var copy = obj.slice(0);//浅拷贝只是复制了引用类型元素的地址,所以在修改的obj中的某个元素的时候,原来的元素也改变。
copy[1].name = 'lucky';
console.log(obj[1].name); //lucky
console.log(copy[1].name); //lucky
细胞们,明天加油!
