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]
.
Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
Related problem: Reverse Words in a String II
分析:题意为 将n个元素的数组向右旋转k步
思路:用vector容器的东西来做很简单
代码如下:(O(1) Space)
class Solution { public: void rotate(vector<int>& nums, int k) { for(int i=0;i<k;i++) { nums.insert(nums.begin(), nums.back()); nums.pop_back(); } } };
然后换种方法:
class Solution { public: void rotate(vector<int>& nums, int k) { int n=nums.size(); vector<int> v(n); for(int i=n-k,j=0;i<n-1,j<k-1;i++,j++){ v[j]=nums[i]; } for(int i=0,j=k;i<n-k-1,j<n-1;i++,j++){ v[j]=nums[i]; } nums=v; } };
出错:Last executed input:[1,2,3,4,5,6], 11
因为没有考虑到当k大于n的情况,所以需要改进:
class Solution { public: void rotate(vector<int>& nums, int k) { int n = nums.size(); vector<int> rot(n); for(int i = 0; i < n; i++) { if((i + k) < n) rot[i + k] = nums[i]; if((i + k) >= n) { rot[(i + k)%n] = nums[i]; } } nums = rot; } };
c语言
看看:
void rotate(int* nums, int numsSize, int k) { int i; if(k > numsSize) k -= numsSize; int* temp = (int*)calloc(sizeof(int), numsSize); for(i = 0; i < k; i++) temp[i] = nums[numsSize - k + i]; for(; i < numsSize; i++) temp[i] = nums[i - k]; for(i = 0; i < numsSize; i++) nums[i] = temp[i]; }
或:
void reverse(int *nums, int start, int end) { int tmp; while (start < end) { tmp=nums[start]; nums[start]=nums[end]; nums[end]=tmp; ++start; --end; } } void rotate(int* nums, int numsSize, int k) { k=k%numsSize; if (k==0) return; reverse(nums,0,numsSize-k-1); reverse(nums,numsSize-k,numsSize-1); reverse(nums,0,numsSize-1); }