目录
题目
解题思路
完整代码
题目
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
示例:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解题思路
主要的解题思路是,先把整个数组翻转过来,再把要翻转的部分翻转为正确顺序,最后再把剩余的部分翻转回来,这就是说总体上有三次大翻转,其余的小翻转次数暂时不计。
首先我们可以先自己实现一个reverse方法,来实现数组中部分元素位置的交换,这里和之前学过的数值交换的方法很像。
private void reverse(int[] nums, int i, int j) {
while (i < j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
j--;
}
}
从上面题目所描述的要求我们能得出这样一个规律:
轮转k次 等于 轮转k%n次
public void rotate(int[] nums, int k) {
int n = nums.length;
k %= n; //
reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);
}
完整代码
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
k %= n; // 轮转 k 次等于轮转 k%n 次 k = 3
reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);
}
private void reverse(int[] nums, int i, int j) {
while (i < j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
j--;
}
}
}
public class Test {
public static void main(String[] args) {
Solution solution = new Solution();
int[] arr = {1,2,3,4,5,6,7};
solution.rotate(arr,3);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
如果,对于其中某些步骤不是很了解的情况下,可以通过调试的方式,慢慢来了解里面的含义,关于调试部分,可以看这部分:Java刷题:移除数组中与k值相等的元素-CSDN博客