JavaScript 寻找具有相同左旋和右旋的数字的最长子序列

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)。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程