189_轮转数组[MEDIUM]
约 335 字大约 1 分钟
2026-03-23
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]示例 2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]解题思路
三次翻转:
- 整体翻转
- 翻转前k个元素
- 翻转后面元素
注意,k 可能大于数组长度,先取余
原始数组:[1, 2, 3, 4, 5, 6, 7]
整体翻转:[7, 6, 5, 4, 3, 2, 1]
翻转前 k (3) 个:[5, 6, 7, 4, 3, 2, 1]
翻转剩余部分:[5, 6, 7, 1, 2, 3, 4] -> 完成Java实现
public void rotate(int[] nums, int k) {
if (nums.length <= 1){
return;
}
// k 可能大于数组长度,取余
k = k % nums.length;
// 1.整体翻转
reverse(nums, 0, nums.length-1);
// 2.翻转前k个元素
reverse(nums, 0, k-1);
// 3.翻转后面元素
reverse(nums, k, nums.length-1);
}
private void reverse(int[] nums, int start, int end){
while (start < end){
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}