思路一:
1. 最笨头插法
递归头插,可以解决,但是不推荐,因为当数据很大时成本很大
2. 三次翻转解决
采用翻转的方式(例子:数组:12345,k: 3)
第一次翻转:54321
第二次翻转:34521(根据分界线翻转前半部分)
第三次翻转:34512(根据分界线翻转前半部分)
此题面试常考,大家可以记一下此方法。
注意点: k值应该对整个数组长度取余,不可以大于数组长度
void reverse(vector<int> &nums, int begin, int end)
{
while(begin < end)
{
int temp = nums[begin];
nums[begin] = nums[end];
nums[end] = temp;
++begin;
--end;
}
}
void rotate(vector<int>& nums, int k)
{
if(1 == nums.size())
return;
// 此处应注意 k值应该对整个数组长度取余,不可以大于数组长度
k %= nums.size();
reverse(nums, 0, nums.size() - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.size() - 1);
}
3. 使用额外数组
void rotate(vector<int>& nums, int k)
{
k %= nums.size();
int iMove = nums.size() - k;
vector<int> result;
for(int i = iMove; i < nums.size(); ++i)
result.push_back(nums[i]);
for(int i = 0; i < iMove; ++i)
result.push_back(nums[i]);
nums = result;
}