JavaScript 检查所有数组元素是否可以通过旋转数字转换为矩形数
矩形数也称为长方形数,矩形数是两个连续数的乘积。我们将得到一个整数数组,并可以在任何方向上旋转数字以获得所有组合。对于通过旋转数字产生的任何组合,如果每个数组元素都可以转换为矩形数,则打印true,否则打印false。
矩形数
首先,让我们讨论矩形数:矩形数是两个连续数的乘积。
在数学上说,如果我们有整数x,它的下一个连续数将是x+1,并且令数字k是它们两个的乘积,那就是:k = (x)*(x+1)。一些矩形数的示例是:
- 0是0和1的乘积。
-
1是1和2的乘积。
-
6是2和3的乘积。
-> 12、20、30、42、56、72、90、110、132、156、182、210、240、272
等。
示例
假设我们有一个数组:
{ 21, 65, 227, 204, 2}
输出:是
解释:
对于第0个索引:21,经过一次旋转可以转换为12,这是3和4的乘积,因此是矩形数。
对于第1个索引:65,经过一次旋转可以转换为56,这是7和8的乘积,因此是矩形数。
对于第2个索引:227,经过一次旋转可以转换为272,这是一个矩形数。
类似地,204变为420,2本身是一个矩形数。
方法
我们已经看到了代码的示例,现在让我们移动到步骤−
- 首先,我们将定义一个函数来旋转给定的数字。一个整数将作为参数传递,并转换为字符串。
-
使用substring方法,我们将字符串向右旋转,然后再转换回数字并返回。
-
我们将定义一个函数来检查当前数字是否是“pronic”。
-
我们将找到当前数字的平方根的下取整,并将其乘以它的下一个数字,以判断当前数字是否是“pronic”。
-
我们将定义一个函数来找出当前数字中的位数,将其转换为字符串。
-
在主函数中,我们将遍历数组,并且对于每个元素,我们将旋转它的长度次数,直到找到“pronic”数字或达到最长次数。
-
如果在所有迭代之后找到任何数字都不是“pronic”,而我们无法将其转换为“pronic”数字,则打印no,否则打印yes。
示例
在下面的示例中,我们检查是否可以通过旋转数字将所有数组元素转换为“pronic”数字。输入和预期输出如下所示。
输入:数组 = [21, 65, 227, 204, 2]
预期输出:是
// function to rotate the digits
function rotate(num){
// converting integer to string
var str = num.toString();
// putting first index value to last
str = str.substring(1) + str.substring(0,1);
// converting back string to integer
num = parseInt(str);
return num;
}
// function to check whether current number if pronic number or not
function isPronic(num){
// getting square root of the current number
var cur = Math.sqrt(num);
// taking floor of cur
cur = Math.floor(cur);
if(cur*(cur+1) == num) {
return true;
}
else {
return false;
}
}
// function to find the length of the current integer
function number_length(num){
var str = num.toString()
var len = str.length;
return len;
}
// function to check whether array is pronic or not
function check(arr){
var len = arr.length;
for(var i =0; i<len; i++){
// getting length of the current number
var cur = number_length(arr[i]);
while(cur--){
if(isPronic(arr[i])){
break;
}
arr[i] = rotate(arr[i]);
}
if(isPronic(arr[i]) == false){
return false;
}
}
return true;
}
var arr = [21, 65, 227, 204, 2]
console.log("Array:", JSON.stringify(arr))
if(check(arr)){
console.log("The elements of array can be converted to pronic numbers.");
}
else{
console.log("The elements of array can't be converted to pronic numbers.");
}
输出
Array: [21,65,227,204,2]
The elements of array can be converted to pronic numbers.
时间和空间复杂度
上述代码的时间复杂度是O(N),其中N是数组的大小。在遍历数组和获取其平方根时,我们都会额外加上数字大小的对数因子,但由于给定整数的最大长度非常小,对线性时间复杂度没有影响。
上述代码的空间复杂度是常数或O(1),因为我们这里没有使用任何额外的空间。
结论
在本教程中,我们实现了一个JavaScript程序,通过旋转数字的位数,来判断是否能将数组的每个元素转换为pronic数。我们定义了一些函数来旋转数字、检查它们是否为pronic数以及获取数字的位数。上述代码的时间复杂度是O(N),空间复杂度是O(1)。