Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].
方法1:将k%size进行处理后将最后面k个插入到前面。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
while(k--){
nums.insert(nums.begin(),nums[nums.size()-1]);
nums.pop_back();
}
}
};
方法2:虽然方法1不是在速度上最好的方法,但是在实现的过程中仍然可以学习到一些细节,例如上面的代码在插入时,是将后面的数字一个接着一个插入到前面,这样每插入一次(insert)nums里面的元素都要进行向后移动一次,这样耗费时间较多。那么将最后k%size个数字取出,然后数组增体向后移动,最后插入到前面。
class Solution {
public:
void rotate(vector<int>& nums, int k){
int step = k%nums.size();
if(step==0)
return;
vector<int> vt;
for(int i = nums.size()-step;i<nums.size();i++){
vt.push_back(nums[i]);
}
for(int i=nums.size()-step-1;i>=0;i--){
nums[i+step]=nums[i];
}
for(int i=0;i<step;i++)
nums[i]=vt[i];
}
};
方法2也可以完全用STL的方法进行表示,熟练STL。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
vector<int> res;
k = k%nums.size();
while(k--){
res.push_back(nums[nums.size()-1]);
nums.pop_back();
}
nums.insert(nums.begin(),res.rbegin(),res.rend());
}
};
方法3:将第i个与第(i+k)%size个进行交换,然后在(i+k)%size个与(i+2*k)%size个交换,注意(i+n*k)%size==i的情况。
class Solution {
public:
void rotate(vector<int>& nums, int k){
if(k%nums.size()==0)
return ;
int number = nums.size();
int i=0,start=i,current_num=nums[i];
while(number--){
i = (i+k)%nums.size();
int temp = nums[i];
nums[i] = current_num;
if(start==i){
i++;
start=i;
current_num = nums[i];
}
else
current_num = temp;
}
return;
}
};