整数反转

230 阅读1分钟

整数反转

前沿说明:算法学习,日常刷题记录。

题目链接

整数反转

题目内容

给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。

如果反转后整数超过32位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回0。

假设环境不允许存储64位整数(有符号或无符号)。

// 示例1:
输入:x = 123
输出:321

// 示例2:
输入:x = -123
输出:-321

// 示例3:
输入:x = 120
输出:21

// 示例4:
输入:x = 0
输出:0

// 提示:
-2^31 <= x <= 2^31 - 1

分析过程

定义sum为反转后的整数,初始值为0,每一次得到的余数都加上sum乘以10,最后就会得到反转后的整数。

  • 我们举例是 123。
  • 那么第一次得到 3, 0×10+3 = 3
  • 第二次得到 2, 3×10+2 = 32
  • 第三次得到1,32×10+1 = 321
  • 刚好就是123反转过来的321。

解答代码:

const reverse = (x) => {
  let res = 0;
  while(x) {
    // 123 % 10 === 3, 12 % 10 === 2, %取商
    res = res * 10 + (x % 10);
    // 1234/10 === 123.4, /取余
    x = ~~(x/10);
  }
  return res;
};

reverse(12345); // 54321

~按位取反

对于整数相当于取反减一

~0 === -1
~1 === -2
~-1 === 0
~-2 === 1

对于小数相当于舍去小数位再取反减一

~0.3 === -1
~1.7 === -2
~-0.3 === -1
~-1.2 === 0
~-2.9 === 1

~~按位取反再取反

对于整数还是自身

~~1 === 1
~~-1 === -1
~~0 === 0

对于小数,等于舍去小数位 相当于正数向下取整,负数向上取整

~~1.1 === 1
~~1.9 === 1
~~-1.1 === -1
~~-1.9 === -1

今天结束,下次继续~