算法-反转整数

难度:简单

描述

将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数)。

样例:

给定 x = 123,返回 321

给定 x = -123,返回 -321

给定 x = 1534236469, 返回 0


这题很简单,自己想一下!

这题很简单,自己想一下!

这题很简单,自己想一下!


解法:

  1. 最优:转字符串 再转数组进行操作
  2. 看到有人用四则运算+遍历反转整数,会把这个解法放到下面

提示:

整数溢出的值为Math.pow(2, 31) - 1Math.pow(-2, 31) + 1,转为数字:2147483647-2147483647

这部分跟位操作符,二进制有关,有兴趣可以去搜下。

code:

  1. 转数组操作:

    const reverseInteger = (n) => {
        if (n < 0) {
            n = n.toString().split('-')[1]; // 负数提取数字
            n = '-' + [...n].reverse().join('');
            n = +n; // 转数字
        } else {
            n = n.toString(); // 转字符
            n = +[...n].reverse().join(''); // 转为数组 颠倒数组 再合字符 最后转数字
        }
        if (n >= Math.pow(2, 31) - 1 || n <= Math.pow(-2, 31) + 1) { // 判断溢出
            return 0;
        }
        return n;
    }
    
  2. 遍历,一位一位颠倒:

    const reverseInteger = function (n) {
        if (n === 0) return 0;
        let res = 0
        while (n !== 0) {
            // 从个位起一位一位的颠倒
            res = res * 10 + n % 10;
            n = parseInt(n / 10);  // n除以10, 一位数转化完成 到最后小于1 被转成0 退出循环
        }
        if (res >= 2147483647 || res <= -2147483647) {
            return 0;
        }
        return res;
    }
    

转数组操作运行效率也更高点:

github 算法仓库地址

2018.8.23

听说,打赏我的人最后都找到了真爱。