题目:
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.
Hint:
Could you do it in-place with O(1) extra space?
Could you do it in-place with O(1) extra space?
题解:
全反转,前k反转,后半反转。
C++版:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if(k >= nums.size())
k %= nums.size();
if(nums.size() == 1 || k == 0)
return;
for(int i = 0; i < nums.size() / 2; i++) {
int t = nums[nums.size() - 1 - i];
nums[nums.size() - 1 - i] = nums[i];
nums[i] = t;
}
for(int i = 0; i < k / 2; i++) {
int t = nums[k - 1 - i];
nums[k - 1 - i] = nums[i];
nums[i] = t;
}
for(int i = k; i <= (nums.size() - 1 + k) / 2; i++) {
int t = nums[nums.size() - 1 - i + k];
nums[nums.size() - 1 - i + k] = nums[i];
nums[i] = t;
}
}
};
Java版:
public class Solution {
public void rotate(int[] nums, int k) {
if(k >= nums.length)
k %= nums.length;
if(nums.length == 1 || k == 0)
return;
for(int i = 0; i < nums.length / 2; i++) {
int t = nums[nums.length - 1 - i];
nums[nums.length - 1 - i] = nums[i];
nums[i] = t;
}
for(int i = 0; i < k / 2; i++) {
int t = nums[k - 1 - i];
nums[k - 1 - i] = nums[i];
nums[i] = t;
}
for(int i = k; i <= (nums.length - 1 + k) / 2; i++) {
int t = nums[nums.length - 1 - i + k];
nums[nums.length - 1 - i + k] = nums[i];
nums[i] = t;
}
}
}
Python版:
class Solution(object):
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: void Do not return anything, modify nums in-place instead.
"""
if k >= len(nums):
k = k % len(nums)
if len(nums) == 1 or k == 0:
return
for i in range(len(nums) / 2):
t = nums[len(nums) - i - 1]
nums[len(nums) - i - 1] = nums[i]
nums[i] = t
for i in range(k / 2):
t = nums[k - i - 1]
nums[k - i - 1] = nums[i]
nums[i] = t
for i in range(k, (len(nums) - 1 + k) / 2 + 1):
t = nums[len(nums) - 1 - i + k]
nums[len(nums) - 1 - i + k] = nums[i]
nums[i] = t