***
刚学JS不久,在leecode刷到此题时:
看了官方解答写(copy)了如下代码:
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
var rev=0,temp=x;
while(temp>=10||temp<=-10){
rev = rev*10+temp%10;
temp=temp/10;
} rev = rev*10+temp;
if(x<0){
return (rev > 2**31 || (-rev) > 2**31-1 )? 0 : rev;
}
else{return (rev > 2**31-1 || -rev > 2**31 )? 0 : rev;
}
};
输出如图:
为何会是4??
由于以前学习过C和C++,所以看到这个答案十分迷惑。网上搜了一圈,了解到在JS中,由于直接定义var变量类型而不是int类型, 整数相除会保留小数点。
以123为例子,第一轮rev=3,temp=12.3;第二轮rev=30+2.3=32.3,temp=1.23;while循环完后rev =323+1.23=324.23,所以最后输出为324。
把 temp = temp/10 改为 temp = Math.floor(temp/10),这里Math.floor意为向下取整,这样就可以实现想要的结果了,但是当x为负数时,结果就又会有问题了,比如Math.floor(-100/3) = - 34。 使用位运算可以解决: temp = ~~(temp/10);
另外还有Math.ceil(x)为向上取整,Math.round(x)为四舍五入。
并且在JS中3.5 % 2求余数的值为1.5。对于负数情况,Math.floor向下取整可能会得到我们不想要的结果,使用位运算可以提高效率的同时得到想要的结果,以下为某网站截图:
截图原文来源如下:
原文