JavaScript 寻找具有相同左旋和右旋的数字的最长子序列
我们将在JavaScript编程语言中实现一个代码,用于查找给定数字的最长子序列,该子序列具有相同的左旋和右旋。给定数字的左旋和右旋意味着,对于左旋,我们必须将数字的最左边的数字移动到末尾位置或最右边的位置。同样,对于右旋,我们必须将数字的最右边的数字移动到第一个位置或最左边的位置。我们将看到完整的实现代码。
问题介绍
在这个问题中,我们给定一个数字,我们必须找到一个子序列(一个数字或字符串的子序列,可以通过从给定数字或字符串中删除一些字符或数字来找到),该子序列具有相同的左旋和右旋,如果有多个,则必须提供最大长度的子序列。
例如 –
如果给定的数字是100310801,那么我们可以有许多具有相同右旋和左旋的序列 –
- 所有大小为1的序列都有相同的左旋和右旋。
-
所有大小为2且两个数字都相同的序列也具有相同的左旋和右旋。
-
我们可以有值为1010和0000的序列或大小为四的序列,这些序列可以具有相同的左旋和右旋。
我们有两种解决这个问题的方法,请看如下 –
原生方法
直接和简单的方法是蛮力法,其中我们可以找到给定数字的所有子序列,然后对于每个子序列,我们可以找到其左旋和右旋并进行匹配。如果两者相同,则我们将检查子序列的长度。如果当前子序列的长度大于之前存储的长度,则可以更新它。
这种方法存在一个问题,即时间复杂度。查找具有N位数字的给定数字的每个子序列的时间复杂度是2的N次方,然后查找左旋和右旋将额外需要N,这使得总时间复杂度为O()。对于大于20的数字,这对于在合理时间内计算来说并不好,使该方法效率低下。
主要方法
在主要方法中,我们将采用一种优化的方法,通过从示例中简单观察得出:如果子序列是单一大小,则总是存在左旋和右旋相等的情况。另一个观察是,给定数的长度或数字的数量必须为偶数,在奇数位置上出现的所有数字必须相同,并且在偶数位置上出现的所有数字必须相同。例如,898989,78,656565等,这些类型的数字总是具有相同的左旋和右旋。
我们的目标是找到最大的数字或最长的子序列,为此我们将遵循以下步骤 –
示例
// creating function to just pass the string
// or number to get the result
function findAltSubSeq(str){
// Length of the given string
var num = str.length
// answer variable to store the answer
var ans = -1;
// Iterate for all possible combinations
// of a two-digit numbers
var digits = 10
for (var i = 0; i < digits; i++) {
for (var j = 0; j < digits; j++) {
var current = 0
var temp = 0
// Check for alternate occurrence
// of current combination
for (var k = 0; k < num; k++) {
if (temp == 0 && str[k] - '0' == i) {
temp = 1;
// Increment the current value
current++;
}
else if (temp== 1 && str[k] - '0' == j) {
temp = 0;
// Increment the current value
current++;
}
}
// If alternating sequence is
// obtained of odd length
if (i != j && current % 2 == 1)
// Reduce to even length
current--;
// Update answer to store
// the maximum
ans = Math.max(current, ans);
}
}
// Return the answer
return ans;
}
// calling the function
// taking the number in string version
var str = "100210601";
console.log("Subsequcne with the maximum length is of length: " + findAltSubSeq(str));
时间和空间复杂度
以上代码的时间复杂度为O(N),其中N是给定数字的长度。该程序的空间复杂度为O(1),因为我们在这里没有使用任何额外的空间。
注意:在以上代码中,我们将数字作为字符串而不是数字数据类型,因为在JavaScript中与数字相比,使用字符串更容易操作,所以如果给定了数字,最好将其转换为字符串。
结论
在本文中,我们在JavaScript编程语言中实现了一个代码,用于查找给定数字的最长子序列,该子序列具有相同的左旋和右旋。左旋是将最右边的元素或数字移到最左边的位置,右旋正好相反。我们讨论了两种方法,一种是简单的蛮力方法,另一种是高效的双指针方法,时间复杂度为O(N),空间复杂度为O(1)。