JavaScript 数组按K索引逆时针旋转的范围求和查询

JavaScript 数组按K索引逆时针旋转的范围求和查询

逆时针旋转数组意味着将给定数组的所有元素向左旋转给定的索引数。在本文中,我们将实现一个JavaScript程序,用于按k索引逆时针旋转数组的范围求和查询。

问题介绍

在这个问题中,我们有一个包含一些整数的数组和另一个数组,其中包含成对形式的值。每对将是当前查询所需的旋转次数,经过给定次数的旋转后,我们将获得一个范围,并需要回答该给定范围中元素的总和。示例,

示例1:

Input
Given array: [1, 2, 3, 4, 5, 6] 
Query: [3, 1, 4]
Output 14

解释

旋转次数为3,所以经过3次旋转后的数组是4 5 6 1 2 3。

在范围1到4内的元素是5、6、1和2。所以,它们的和是14。

示例2

Input
Given array: [1, 2, 3, 4, 5, 6] 
Query: [8, 0, 3]
Output 18

说明

旋转次数为8,所以经过8次旋转后的数组等于8%(数组的长度)次旋转,因为在数组长度的次数旋转后,同样的数组又出现,意味着8次旋转等同于2次旋转。

因此,经过8次旋转后的数组为3 4 5 6 1 2。

在范围内,0到3的元素是3、4、5和6。所以,它们的和为18。

简单方法

在简单方法中,我们将简单地按照查询数组中指定的步骤执行所有步骤。示例,如果给定要旋转数组,则我们将按照给定的次数旋转数组元素,然后检查范围内元素的和。让我们看一下它的代码−

示例

// function to answer the queries 
function getSum(arr, rotations, L, R){
   var len = arr.length 
   var rot = rotations % len;
   var temp = new Array(len);

   // rotating the given array
   for(var i =0;  i< len - rot; i++ ){
      temp[i] = arr[i + rot];
   }

   // getting the last elements 
   for(var i = 0; i < rot; i++)    {
      temp[len-rot+i] = arr[i];
   }

   // getting the required sum
   var sum = 0;
   for(var i = L; i<=R; i++){
      sum += temp[i];
   }
   console.log("The sum of the elements in the range " + L + " to " + R + " after " + rotations + " number of rotations is " + sum);
}

// defining the array 
var arr = [ 1, 2, 3, 4, 5, 6]

// defining the queries array 
var queries = [ [ 3, 1, 4], [ 8, 0, 3]]

// traversing over the given array 
for(var i = 0; i<queries.length; i++){
   getSum(arr, queries[i][0], queries[i][1], queries[i][2]);
}

时间和空间复杂度

上述代码的时间复杂度为O(Q*N),其中Q是查询的数量,N是数组的大小。

上述代码的时间复杂度为O(N),因为我们创建了一个大小为N的新数组。

前缀和方法

在前缀和方法中,我们将创建一个前缀和数组,前缀和数组的每个索引包含当前索引之前所有元素的和。让我们看看代码示例―

示例

// function to answer the queries 
function getSum(preSum, rotations, L, R){
   var len = preSum.length 
   var rot = rotations % len;

   // updating L and R 
   L = (L + rot) %len
   R = (R + rot) %len
   var sum = 0;
   if(L <= R) {
      if(L == 0) {
         sum = preSum[R];
      }
      else{
         sum = preSum[R]-preSum[L-1];
      }
   }
   else{
      sum += preSum[R];
      sum += preSum[len-1]-preSum[L-1];
   }
   console.log("The sum of the elements in the range " + L + " to " + R + " after " + rotations + " number of rotations is " + sum);
}

// defining the array 
var arr = [ 1, 2, 3, 4, 5, 6]
var preSum = new Array(arr.length)
preSum[0] = arr[0]
for(var i = 1; i<arr.length; i++){
   preSum[i] = preSum[i-1] + arr[i]
}

// defining the quries array 
var queries = [ [ 3, 1, 4], [ 8, 0, 3]] 

// traversing over the given array 
for(var i = 0; i<queries.length; i++){
   getSum(preSum, queries[i][0], queries[i][1], queries[i][2]);
}

时间和空间复杂度

上述代码的时间复杂度为O(Q),其中Q是查询的数量。

上述代码的时间复杂度是O(N),因为我们创建了一个新的数组来存储数组元素的前缀和。

结论

在本教程中,我们实现了一个JavaScript程序,用于对数组进行逆时针旋转k个索引的范围求和查询。数组的逆时针旋转意味着将给定数组的所有元素向左侧按给定索引数进行旋转。我们实现了两种方法,第一种是原生方法,时间复杂度为O(Q*N),另一种是前缀和方法,时间复杂度为O(Q)。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程