问题描述
给定一个数组, 将数组中的元素向右移动k个位置, 其中k是非负数
示例1
输入: [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]
代码示例:
class Solution {
public:
#if 0
void rotate(vector<int>& nums, int k) {
int len = nums.size();
k %= len;
vector<int> res(len, 0);
int j = 0;
for (int i = len - 1 - k; i < len; ++i)
{
res[j++] = nums[i];
}
for (int i = 0; i < len - 1 - k; ++i)
{
res[j] = nums[i];
j++;
}
}
#elif 0
void rotate(vector<int>& nums, int k) {
int len = nums.size();
k %= len;
vector<int> tmp;
tmp = nums;
for (int i = 0; i < len; ++i)
{
tmp[(i + k) % len] = nums[i];
}
for (int i = len - 1; i > k - 1; --i)
{
nums[i] = nums[i - k];
}
for (int i = 0; i < k; ++i)
{
nums[i] = tmp[i];
}
}
#elif 0
//时间复杂度较高
//逐个右移
void rotate(vector<int>& nums, int k) {
int len = nums.size();
int last = nums[len - 1];
for (int i = 0; i < k; ++i)
{
for (int j = len - 1; j > 0; --j)
{
nums[j] = nums[j - 1];
}
nums[0] = last;
last = nums[len - 1];
}
}
#elif 1
//数组整体翻转, 再根据k值分段翻转
void reverseArr(vector<int> & num, int left, int right)
{
while (left < right)
{
int tmp = num[left];
num[left] = num[right];
num[right] = tmp;
left++;
right--;
}
}
void rotate(vector<int>& nums, int k) {
int len = nums.size();
k %= len;
reverseArr(nums, 0, len - 1);
reverseArr(nums, 0, k - 1);
reverseArr(nums, k, len - 1);
}
#endif
};