作者:轩轩20110804 | 来源:互联网 | 2024-11-19 14:30
在编程领域中,数组操作是一项基本技能。本文将讨论如何实现数组的右移轮转功能,即将数组中的所有元素向右移动特定数量的位置。
问题描述:
任务是编写一个函数,该函数接收一个整数数组和一个非负整数 k
作为参数,将数组中的每个元素向右移动 k
个位置。如果 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]
限制条件:
1 <= nums.length <= 10^5
-2^31 <= nums[i] <= 2^31 - 1
0 <= k <= 10^5
解题思路:
一种有效的方法是使用反转算法。首先,整个数组被反转;然后,前 k
个元素被反转;最后,剩余的元素也被反转。这种方法的时间复杂度为 O(n),空间复杂度为 O(1),非常高效。
代码 (C++):
class Solution {
public:
void reverse(vector& nums, int start, int end) {
while (start swap(nums[start], nums[end]);
start++;
end--;
}
}
void rotate(vector& nums, int k) {
k %= nums.size();
reverse(nums, 0, nums.size() - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.size() - 1);
}
};