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 class Solution { 2 public: 3 void rotate(vector<int>& nums, int k) { 4 if(k > nums.size()) k %= nums.size();//这里要注意,k的大小可能比size要大一点 5 vector<int> tmpVec1{nums.begin(), nums.begin() + (nums.size() - k)}; 6 vector<int> tmpVec2{nums.begin() + (nums.size() - k), nums.end()}; 7 int sz1 = tmpVec1.size(); 8 for(int i = 0; i < sz1; ++i){ 9 tmpVec2.push_back(tmpVec1[i]); 10 } 11 nums = tmpVec2; 12 } 13 };
上面这个是数组拷贝的方法,不过速度比较慢一点,一开始用一个二重循环来解决,不过那样总是超时,所以又想了上面这个方法。
还有题目说了希望可以用到O(1)的额外空间。看了下别人写的:炒鸡简单啊
1 class Solution { 2 public: 3 void rotate(vector<int>& nums, int k) { 4 int sz = nums.size(); 5 k %= sz; 6 reverse(nums.begin(), nums.begin() + (sz - k)); 7 reverse(nums.begin() + (sz - k), nums.end()); 8 reverse(nums.begin(), nums.end()); 9 } 10 };
先把前面的部分反转,再将后面的部分反转,最后再做一次反转就可以了。
java接比较坑爹啊,还要自己手写反转函数,额,这一点没有STL好用了,可能只是我不知道罢了,代码如下:
1 public class Solution { 2 public void rotate(int[] nums, int k) { 3 k = k % nums.length; 4 rev(nums, nums.length-k, nums.length - 1); 5 rev(nums, 0, nums.length-k-1); 6 rev(nums, 0, nums.length - 1); 7 } 8 9 //自己要单独的写一个rev函数 10 public void rev(int [] arr, int start, int end){ 11 int tmp = 0; 12 while(start < end){ 13 tmp = arr[start]; 14 arr[start] = arr[end]; 15 arr[end] = tmp; 16 start++; 17 end--; 18 } 19 } 20 }