整数反转
前沿说明:算法学习,日常刷题记录。
题目链接
题目内容
给你一个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
今天结束,下次继续~