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; } };转载于:https://www.cnblogs.com/GoFly/p/5751066.html
相关资源:JAVA上百实例源码以及开源项目