C++ 程序在 K 次左旋转后查找数组的第 M 个元素

c++server side programmingprogramming

在这个问题中,我们需要在将数组旋转 K 次后从给定索引打印元素。

这个问题教我们从旋转数组中的特定索引中找到元素。乍一看,想到的解决方案是将数组旋转 K 次并访问第 M 个元素,但我们还将学习如何在不旋转数组的情况下访问旋转数组中的第 M 个元素。

问题陈述

我们给出了包含 N 个数字的 arr[] 数组。另外,我们给出了正整数 M 和 K。我们需要将 arr[] 数组左旋转 K 次,并返回数组的第 M 个元素。

示例

输入 – arr[] = {10, 12, 34, 3, 7, 6}, K = 3, M = 2
输出 – 7

解释

我们先将数组旋转 3 次。

  • 第一次旋转后,数组为 {12, 34, 3, 7, 6, 10}。

  • 第二次旋转后,数组为 {34, 3, 7, 6, 10, 12}旋转。

  • 最终旋转后更新的数组为 {3, 7, 6, 10, 12, 34}。

因此,更新后的数组中的第 2 个元素为 7。

输入 – arr[] = {76, 43, 4, 5, 9, 69, 12, 54}, K = 0, M = 5
输出 – 9

解释

我们不需要旋转数组,因为 K 为 0。因此,原始数组中的第 5 个元素为 9。

输入 – arr[] = {76, 43, 4, 5, 9, 69, 12, 54}, K = 10, M = 3
输出 – 9

解释

经过 10 次旋转后的最终数组为 {4, 5, 9, 69, 12, 54, 76, 43}。因此,更新后的数组中的第 3 个元素是 9。

方法 1

在此方法中,我们将所有数组元素与其下一个元素交换 K 次,并将第一个元素与最后一个元素交换,以将数组旋转 K 次。

之后,我们将从所需索引访问数组元素。

算法

  • 步骤 1 - 使用循环进行总共 K 次迭代。

  • 步骤 2 - 使用 arr[q] 元素初始化"temp"变量。

  • 步骤 3 - 之后,使用 arr[q + 1] 元素更新 arr[q]。

  • 步骤 4 - 接下来,更新 arr[q + 1] 与 temp 元素。

  • 步骤 5 − 从 M – 1 索引返回数组元素。

示例

#include <bits/stdc++.h>
using namespace std;

int arr_rotation(int arr[], int arr_len, int K, int M) {
   // 对数组进行 K 次左旋转
   for (int p = 0; p < K; p++) {
      for (int q = 0; q < arr_len - 1; q++) {
         int temp = arr[q];
         arr[q] = arr[q + 1];
         arr[q + 1] = temp;
      }
   }
   // 返回 M 索引中的元素
   return arr[M - 1];
}

int main() {
   int arr[] = {10, 12, 34, 3, 7, 6};
   int arr_len = sizeof(arr) / sizeof(arr[0]);
   int K = 3, M = 2;
   cout << "The array element after " << K << " rotations at the " << M << " index is " << arr_rotation(arr, arr_len, K, M);
   return 0;
}

输出

The array element after 3 rotations at the 2 index is 7
  • 时间复杂度 − O(N*K),其中 N 是数组长度,K 是左旋转的总数。

  • 空间复杂度− O(1),因为我们使用常数空间。

方法 2

如果我们将数组旋转 K 次,则第 K 个(基于 0 的索引)将成为数组的第一个索引。如果 K 大于数组长度,我们需要通过对数组长度取模使其小于数组长度。

之后,我们可以从旋转数组中的第 K 个索引访问第 (M - 1) 个元素。

算法

  • 步骤 1 - 对 K 执行数组长度的模运算。

  • 步骤 2 - 将 '(K + M - 1) % arr_len' 的结果值存储到 'ind' 变量中。

  • 步骤 3 - 从 'ind' 索引访问数组元素并将其存储在 'ele' 变量中。

  • 步骤 4 - 返回 'ele' 变量的值。

示例

#include <bits/stdc++.h>
using namespace std;

int arr_rotation(int arr[], int arr_len, int K, int M) {
    // 对 K 和 arr_len 取模
    K %= arr_len;
    // 获取第 M 个元素
    int ind = (K + M - 1) % arr_len;
    int ele = arr[ind];
    // 返回元素
    return ele;
}

int main() {
    int arr[] = {10, 12, 34, 3, 7, 6};
    int arr_len = sizeof(arr) / sizeof(arr[0]);
    int K = 3, M = 2;
    cout << "在索引为" << M << "处,经过" << K << "旋转后的数组元素为" << arr_rotation(arr, arr_len, K, M);
    return 0;
}

输出

在索引为 2 处,经过 3 次旋转后的数组元素为 7
  • 时间复杂度 − O(1)

  • 空间复杂度 − O(1)

我们学会了在进行 K 次左旋转后访问第 M 个元素。程序员可能会尝试在进行 K 次右旋转后访问第 M 个元素,或者在进行 K 次右旋转后访问第 (N – M) 个元素。


相关文章