Java程序:查找数组左旋转K次后的第M个元素


在这个问题中,我们将对数组进行K次左旋转,并找到旋转后数组中的第M个元素。

解决这个问题的简单方法是对数组进行K次左旋转,然后从M-1索引处获取元素。

优化的解决方法是找到最终索引值,使得最终索引是旋转后数组的M-1索引。

问题陈述

我们给定一个包含正整数的nums[]数组。我们还给定正整数K和M。我们需要将数组左旋转K次并打印第M个元素。

示例

Input –  nums[] = { 20, 30, 5, 6, 8, 23 }; K = 3, M = 3;
Output – 23

解释

  • 第一次旋转后,数组变为{30, 5, 6, 8, 23, 20}。

  • 第二次旋转后,更新后的数组为{5, 6, 8, 23, 20, 30}。

  • 最终旋转后,数组为{6, 8, 23, 20, 30, 5}。

最终数组中第3个位置的元素是23。

Input –  nums[] = { 20, 30, 5, 6, 8, 23 }; K = 0, M = 3;
Output – 5

解释

我们不需要进行旋转。因此,原始数组中第3个位置的元素是5。

Input –  nums[] = { 20, 30, 5, 6, 8, 23 }; K = 5, M = 2;
Output – 20

解释

左旋转5次后的数组将是{23, 20, 30, 5, 6, 8},更新后数组中的第2个元素是20。

方法1

在这种方法中,我们将数组左旋转K次。之后,我们将访问数组中M-1索引处的元素。

算法

  • 步骤1 − 开始遍历数组。

  • 步骤2 − 将第一个数组元素存储到'temp'变量中。

  • 步骤3 − 使用另一个嵌套循环遍历数组。在嵌套循环中,用nums[q+1]替换nums[q]。

  • 步骤4 − 在外循环中,用'temp'值替换nums[nums_len - 1]。

  • 步骤5 − 返回nums[M - 1]元素。

示例

import java.util.*;

public class Main {
   public static int findElement(int[] nums, int nums_len, int K, int M){
      // Making K left rotations of array
      for (int p = 0; p < K; p++) {
         int temp = nums[0];
            for (int q = 0; q < nums_len - 1; ++q) {
            nums[q] = nums[q + 1];
         }
         nums[nums_len - 1] = temp;
      }
      // Return Mth element of rotated array
      return nums[M-1];
   }
   public static void main(String[] args) {
      int nums[] = { 20, 30, 5, 6, 8, 23 };
      int nums_len = nums.length;
      int K = 3, M = 3;
      System.out.println("The element at " + M + " index after rotating array by " + K + " left rotations is "
      + findElement(nums, nums_len, K, M));
   }
}

输出

The element at 3 index after rotating array by 3 left rotations is 23
  • 时间复杂度 − O(N*K) 进行K次左旋转。

  • 空间复杂度 − O(1),因为我们没有使用任何动态空间。

方法2

在这种方法中,我们将K与数组长度取模。因为如果我们进行的左旋转次数等于数组长度,我们将得到原始数组。

如果我们将数组旋转K次,我们将得到(K - 1)位置的元素位于第一个位置,从那里我们需要获取第M个元素。

算法

  • 步骤1 − 将K与数组长度取模。

  • 步骤2 − 将(K + M - 1)与数组长度取模后的结果值存储到'ind'变量中。

  • 步骤3 − 从'ind'索引访问数组元素,并返回其值。

示例

import java.util.*;

public class Main {
   public static int findElement(int[] nums, int nums_len, int K, int M) {
      K %= nums_len;
      // Get the index of the Mth element
      int ind = (K + M - 1) % nums_len;
      return nums[ind];
   }
   public static void main(String[] args) {
      int nums[] = { 20, 30, 5, 6, 8, 23 };
      int nums_len = nums.length;
      int K = 3, M = 3;
      System.out.println("The element at " + M + " index after rotating array by " + K + " left rotations is "
      + findElement(nums, nums_len, K, M));
   }
}

输出

The element at 3 index after rotating array by 3 left rotations is 23
  • 时间复杂度 − O(1),因为我们没有遍历数组。

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

结论

第一种方法旋转数组K次,但第二种方法根据给定的K和M值计算最终索引值,使问题解决方案更高效。

更新于:2023年10月5日

174 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告