LeetCode整数反转 | 刷题打卡

112 阅读1分钟

题目描述

给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。

链接:整数反转

思路分析

刚刚拿到这题的时候,就想到了数组反转方法reverse,然后就想着把数字先转成字符串然后拆分为数组,通过reverse()方法反转数组然后再join()一起

我的代码

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    if(x>=-(2**31) && x<= (2**31-1)){
        let arr = Math.abs(x).toString().split('')
        if(arr.length==1){
            return x
        } else {
            let tempArr = arr.reverse()
            if(tempArr[0]==0) tempArr.unshift(0)
            let num = x>0?tempArr.join(''):'-'+tempArr.join('')
            if(parseInt(num)>=-(2**31) && parseInt(num)<= (2**31-1)){
                return num
            } else {
                return 0
            }
        }

    }else {
        return 0
    }
};

最后在得到反转之后的整数来判断大小是否在规定范围内,再返回相应值。发现我写的代码有点麻烦,看了下别人的代码特别简单,没有if-else判断

大神代码

var reverse = function(x) {
  let result = 0
  while(x!=0){
  	result = result*10 + x % 10   //取余
    x = (x/10)|0   //去除小数点
  }
  return (result | 0) == result ? result : 0    //(result | 0)判断是否溢出
}

以上代码先取x最后一位,然后对x取整操作,然后一直循环

总结

还是别人的代码简单,主要是利用了或运算符 | 和取整取余的巧妙运算。