题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
利用 Golang 数据类型特性
func reverse(x int) int {
var ret int
for x != 0 {
if temp := int32(ret); int(temp * 10 / 10) != ret {
return 0
}
ret = ret * 10 + x % 10
x = x / 10
}
return ret
}
利用 JavaScript 位运算特性
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。
每次循环中将 result * 10 + (x % 10)
来拼接 result。result * 10
是将 result 提升一位,x % 10
是取 x 最后一位。 比如 result = 12, x = 345,运算后 result 就是 123。
在循环的最后将 x / 10
。因为最后一位已经被拼接了,所以要去掉最后一位。如果 x / 10
的结果小于 1,就意味着这将是最后一位,这一步可以无视小数点,将 x 设置为 0。
这么做的好处是无需关心小数点和正负数的问题。
循环结束后,再去判断是否溢出 2 的 32 次方 -1。JavaScript 中的 number 类型数值虽然可以表示双精度 IEEE754 64 位浮点类型,但在使用按位运算符(Bitwise operators)进行比较时,会把操作数当作 32 位的比特序列。这也算是一个很多人都不知道的知识盲点。
var v1 = 9999999999;
var v2 = v1 | 0;
console.log(v2);