题目描述:
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。对数组进行原地修改;
要注意循环时在某个小范围循环;
答题体会:
1.当有多个中间的暂时存值时,在循环外先定义好,定义为第一次循环时使用的值;
2.当初始条件和结束条件冲突时,用 do while 语句来执行第一次操作;
3.中间值一个不行就两个;
答案:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void rotate(vector<int>& nums, int k) {
int sz = nums.size();
k = k % sz;
int count = 0;
for (int start = 0; count < sz; start++) {
int current = start;
int prev = nums[start];
do {
int next = (current + k) % sz;
int temp = nums[next];
nums[next] = prev;
prev = temp;
current = next;
count++;
} while (start != current);
}
};
//其实我还是觉得这些循环中用到的中间值还是开头定义比较好
int main()
{
vector<int> nums = {1,5,6};
rotate(nums,1);
for(auto n : nums)
{
cout<<" "<<n<<" ";
}
system("pause");
return 0;
}
点击这里看原题;