判断两个数字是否是彼此的位旋转的JavaScript程序
问题陈述 − 给定两个整数,需要检查这两个数是否是彼此的位旋转。
在JavaScript中,所有整数都是32位二进制数,表示为0和1。在这里,我们需要检查如果我们旋转第一个数字的32位字符串;我们是否可以通过对第一个数字旋转32次得到第二个数字的32位字符串。
使用ToString()方法检查两个数字是否位旋转。
toString()方法用于将整数转换为32位二进制数字符串。之后,我们可以添加前导零到二进制字符串中,使其长度达到32位。接下来,我们可以将数字的二进制字符串与自身连接起来,并检查第二个数字的二进制字符串是否存在于合并的字符串中。
语法
用户可以按照以下语法,在连接字符串后检查两个数字是否位旋转。
let num1BinaryDouble = num1Binary + num1Binary;
let isBitRotation = num1BinaryDouble.includes(num2Binary)
算法
- 步骤1 − 使用toString()方法并将2作为参数传递以将两个数字转换为二进制字符串。
-
步骤2 − 接下来,我们需要使两个字符串的大小为32位。所以,向这两个二进制字符串添加前导零。
-
步骤3 − 合并num1的二进制字符串。
-
步骤4 − 检查合并的字符串是否包含num2的二进制字符串。如果是,则意味着两个数字是彼此的位旋转。
示例1
在下面的示例中,checkBitRotations()函数实现了上述算法,以确保两个数字是否为彼此的位旋转。在输出中,用户可以观察到1和2互为位旋转,但1和5则不是。
<html>
<body>
<h3>在JavaScript中检查是否有<i>两个数字是位旋转还是不是</i> </h3>
<div id = "output"> </div>
<script>
let output = document.getElementById("output");
let num1 = 1;
let num2 = 2;
let num3 = 5;
function checkBitRotation(num1, num2) {
let num1Binary = num1.toString(2);
let num2Binary = num2.toString(2);
// append remaining zeros at the start of num1BInary and num2Binary to make it's length 32
while (num1Binary.length < 32) {
num1Binary = "0" + num1Binary;
}
while (num2Binary.length < 32) {
num2Binary = "0" + num2Binary;
}
// double the string
let num1BinaryDouble = num1Binary + num1Binary;
// check if num2Binary is present in num1BinaryDouble
if (num1BinaryDouble.includes(num2Binary)) {
return true;
} else {
return false;
}
}
output.innerHTML += "The " + num1 + " and " + num2 + " are bit rotations of each other " + checkBitRotation(num1, num2) + "<br>";
output.innerHTML += "The " + num1 + " and " + num3 + " are bit rotations of each other " + checkBitRotation(num1, num3) + "<br>";
</script>
</body>
</html>
使用For循环检查两个数字是否位旋转。
在此方法中,我们将数字转换为二进制字符串。之后,我们将使用for循环获取第一个数字的所有旋转,并将所有旋转与第二个数字进行比较。如果第一个数字的任何旋转与第二个数字匹配,则它们是彼此的位旋转。
语法
用户可以按照以下语法将第一个数字的所有旋转与第二个数字进行匹配,并确保它们是彼此的位旋转。
for (let i = 0; i < num1Binary.length; i++) {
if (num1Binary === num2Binary) {
return true;
}
num1Binary = num1Binary[num1Binary.length - 1] + num1Binary.substring(0, num1Binary.length - 1);
}
在上面的语法中,我们逐个比较第一个数字的旋转与第二个数字,并且如果它匹配,则返回true。
算法
- 步骤1 − 使用toString()方法将两个数字转换为二进制字符串。
-
步骤2 − 现在,添加前导零,使它们具有相等的长度。
-
步骤3 − 使用for循环迭代第一个字符串。
-
步骤4 − 如果num1Binary与num2Binary匹配,请返回true。
-
步骤5 − 在for循环中,如果第一个数字的当前旋转与第二个数字不匹配,请旋转第一个数字并获取新的旋转。
-
步骤6 − 继续将下一组旋转与第二个旋转匹配,直到任何旋转匹配为止。如果任何旋转不匹配,则返回false。
示例2
在下面的示例中,我们已实现了上述算法以检查位旋转。在这里,我们逐一获取第一个数字的每个旋转,并将其与第二个数字进行比较。如果第一个数字的任何旋转与第二个数字匹配,我们将返回true,用户可以在输出中观察到。
<html>
<body>
<h3>使用JavaScript检查<i>两个数字是否为彼此的位旋转</i></h3>
<div id = "output"> </div>
<script>
let output = document.getElementById("output");
let num1 = 122;
let num2 = 2147483678;
let num3 = 1;
function checkBitRotation(num1, num2) {
let num1Binary = num1.toString(2);
let num2Binary = num2.toString(2);
// 添加前导零以使两个数字长度相同
while (num1Binary.length < num2Binary.length) {
num1Binary = "0" + num1Binary;
}
// 使用for循环检查num1Binary和num2Binary是否相互旋转
for (let i = 0; i < num1Binary.length; i++) {
if (num1Binary === num2Binary) {
return true;
}
num1Binary = num1Binary[num1Binary.length - 1] + num1Binary.substring(0, num1Binary.length - 1);
}
return false;
}
output.innerHTML += num1 + "和" + num2 + "是位旋转 " + checkBitRotation(num1, num2) + "<br>";
output.innerHTML += num1 + "和" + num3 + "是位旋转 " + checkBitRotation(num1, num3) + "<br>";
</script>
</body>
</html>
用户学习了两种不同的方法来检查两个数字是否为彼此的位旋转。在第一种方法中,我们将第一个字符串与自身拼接,并检查第二个数字是否存在于该字符串中。在第二种方法中,我们使用for循环找出第一个数字的所有位旋转,并将它们与第二个数字进行匹配。