C++程序查找数组K次右移后的第M个元素


右移意味着我们将每个元素向右移动,例如第0个索引的元素移动到第1个索引,第1个索引的元素移动到第2个索引,以此类推,最后一个元素移动到第0个索引。这里我们给定一个大小为n的整数数组,整数m和整数k。我们的任务是在数组进行k次右移后找到第m个元素。

以下是一些示例和解释,以帮助您理解问题。

示例

输入

Array: [ 1, 3, 2, 5, 6, 7 ],
k: 2,
m: 4

输出

3

解释:第1次右移:[ 7, 1, 3, 2, 5, 6 ]

第2次右移:[ 6, 7, 1, 3, 2, 5 ]

数组进行2次(k)右移后的第4个(m)元素是3。

输入

Array: [ 6, 8, 9 ],
k: 1,
m: 1

输出

9

解释:第1次右移:[ 9, 6, 8 ]

数组进行1次(k)右移后的第1个(m)元素是9。

朴素方法

这种方法的思路很简单,首先,我们计算给定数组的第k次右移,然后打印该右移数组的第m个元素。

让我们看看下面的代码,以便更好地理解上述方法。

示例

C++程序查找数组K次右移后的第M个元素。

#include <bits/stdc++.h>
using namespace std;
 
// left rotation of an array by ele
void leftRotation(int n, int array [], int ele){
   reverse (array, array + ele);
   reverse (array + ele, array + n);
   reverse (array, array + n);
}
// right rotation of an array by ele
void rightRotation(int n, int array [], int ele){
   leftRotation(n, array, n - ele);
}
// Create a function to find mth element and return it
int findMthElement(int n, int array [], int k, int m){
   // Call the rightRotation function to rotate given array k times
    for (int i=1; i<=k; i++) {
        rightRotation(n, array, 1);
    }
   // return the final mth element after k right rotation
   return array[m - 1];
}
int main(){
   int array [] = { 1, 3, 2, 5, 6, 7 }; //Given array
   int n = sizeof(array) / sizeof(array [0]); //Getting the size of the array
   int k = 2; //Given integer k
   int m = 4; //Given integer m
   int mthElement = findMthElement(n, array, k, m);
   cout << "mth element after the kth right rotation of an array is: ";
   cout<< mthElement;
   return 0;
}

输出

mth element after the kth right rotation of an array is: 3

时间和空间复杂度

上述代码的时间复杂度为O(n * k),因为我们对大小为n的数组进行了k次旋转。

上述代码的空间复杂度为O(1),因为没有使用额外的空间。

数学方法

在这种方法中,我们使用了数学。数学的概念是,数组在进行n(数组大小)次旋转后与原始数组相同。因此,我们可以说第k次旋转与第k%n次旋转相同。

所以,我们将k转换为k = k%n,现在我们可以确定k的大小小于n(数组大小)。

如果m大于等于k,则答案是给定数组的第(n-k) + (m-1)个元素。

如果m小于k,则答案是给定数组的第(m-1-k)个元素。

为了进一步理解上述方法,让我们看看下面的代码。

示例

C++程序查找数组K次右移后的第M个元素

#include <bits/stdc++.h>
using namespace std;
 
 // Create a function to find mth element and return it
int findMthElement(int n, int array [], int k, int m){
   // as if k is greater than the size of array n
   k = k % n; 
   // Create the mthElementIndex to store the index of mth element
   int MthElementIndex;
   if (k < m) {
      MthElementIndex = (m - k - 1);
   } else {
      MthElementIndex = (n - k) + (m - 1);
   }
   int mthElement = array [MthElementIndex]; // store the final answer
   return mthElement;
}
int main (){   
   int array [] = { 1, 3, 2, 5, 6, 7 }; //Given array
   int n = sizeof(array) / sizeof(array [0]); //Getting the size of the array
   int k = 2; //Given integer k
   int m = 4; //Given integer m
   int mthElement = findMthElement(n, array, k, m);
   cout << "mth element after the kth right rotation of an array is: ";
   cout<<mthElement;
   return 0;
}

输出

mth element after the kth right rotation of an array is: 3

时间和空间复杂度

上述代码的时间复杂度为O(1)。

上述代码的空间复杂度为O(1)。

结论

在本教程中,我们实现了C++程序来查找数组K次右移后的第M个元素。我们实现了两种方法:朴素方法和数学方法。时间复杂度分别为O(n*k)和O(1)。其中n是数组的大小,k是给定的整数k。两种方法的空间复杂度均为O(1)。

更新于: 2023年8月31日

71 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告