算法 - 整数反转

433 阅读3分钟

将算法题记录下来,方便自己查看和复习,练习自己的思维。大家看到后,如果有好的思路和想法,可以留言哦,向大神们学习!

越努力,越幸运!加油!


整数反转

题目描述

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

书写思路

  1. 判断输入的数字是否大于0,大于零则进行第二步,否则进行第三步。

  2. 将输入的数据转换成字符串,利用split()将这一串字符串转换成数组,利用reverse()方法进行数组元素反转,在转换成整数。

  3. 将输入的数据转换成字符串,利用split()将这一串字符串转换成数组,利用reverse()方法进行数组元素反转,在转换成负整数。

  4. 这个整数反转好之后,在进行范围判断,如果超出范围,则返回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

细胞们,明天加油!