作者:lluuaalulua619 | 来源:互联网 | 2023-01-06 16:16
我正在做一些编码挑战,遇到了一些我不太熟悉的东西.我更好奇地了解它是什么以及它为什么存在.
提示非常简单: Given a 32-bit signed integer, reverse digits of an integer.
Example:
Input: -123
Output: -321
Example:
Input: 120
Output: 21
Assume we are dealing with an environment which could only hold integers within the 32-bit signed integer range. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
我想出了这个.
var reverse = function(x) {
var isNegative = false;
if(x <0){
isNegative = true;
x *= -1;
};
var reverseX = parseInt(String(x).split('').reverse((a,b) => a - b).join(''));
if(reverseX > Math.pow(2,32)){
return 0;
}
if(isNegative){
return -1 * reverseX
} else {
return reverseX;
}
};
但是,我对一些失败的测试感到难过:
Input:
1563847412
Output:
2147483651
Expected: 0
根据我的理解,32位整数是2 ^ 32.它在JS中的意义是什么?如果我开始过去会发生什么?(2^32 + 1
)
我的第二个问题,如果我可能会问两个,我是"预期",如果价值reverseX
超过2 ^ 32,但它仍然没有通过测试.
if(reverseX > Math.pow(2,32)){
return 0;
}
0
当我超过32位整数时,如何正确返回?
1> trincot..:
有符号整数的上限不是2 32 - 1,而是2 31 - 1,因为第一位是符号位.
如果进行比较,您将看到您的测试给出了正确的结果.
请注意,Javascript 对数字使用IEEE-754浮点表示,即使它们是整数.但是浮点精度足以在32位整数上执行精确计算.如您所知,您需要进行必要的测试以检测32位溢出.
关于你的代码的一些注释:它将一个参数传递给Array#reverse
方法,这是一个不带参数的方法.我将如何编写它 - 请参阅代码中的注释:
// Name argument n instead of x, as that latter is commonly used for decimal numbers
function reverse(n) {
// Array#reverse method takes no argument.
// You can use `Math.abs()` instead of changing the sign if negative.
// Conversion of string to number can be done with unary plus operator.
var reverseN = +String(Math.abs(n)).split('').reverse().join('');
// Use a number constant instead of calculating the power
if (reverseN > 0x7FFFFFFF) {
return 0;
}
// As we did not change the sign, you can do without the boolean isNegative.
// Don't multiply with -1, just use the unary minus operator.
// The ternary operator might interest you as well (you could even use it
// to combine the above return into one return statement)
return n <0 ? -reverseN : reverseN;
}
console.log(reverse(-123));
console.log(reverse(1563847412));
2> Robbie Milej..:
但是,我对一些失败的测试感到困惑:
Input:
1563847412
Output:
2147483651
Expected: 0
最大32位整数,我相信是(2^31)
为2,147,483,647。这样可以存储负值以及(-2^31)
32位限制(这是“有符号”的含义)。因此,任何数量高于,你可以为你的程序的缘故返回0。如果提示要求你为“未签名”,范围将是0
对2^32
你最初设想。
就失败的测试而言,2147483651
比2,147,483,647
要大4,因此您应该返回0。相反,您应该说reverseX > Math.pow(2,31) - 1
在JS中它的意义是什么?如果我开始学习该怎么办?(2 ^ 32 +1)
Technicially在JS你不受此数的限制,JS使用有效位数 双精度浮点数字。所以最大值实际上是(2^53) - 1