问题描述:
题目来自于力扣
网址为:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/23/
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
解法一:
使用双重循环,每次旋转一位。
注意k的值可能要大于nums.size(),所以要取余数。
代码如下:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
k = k % nums.size();
for(int i=0; i < k;i++){
for(int j =0; j < nums.size();j++){
swap(nums[0],nums[j]);
}
}
}
void swap(int &a, int&b){
int temp;
temp = a;
a = b;
b = temp;
}
};
这个办法会导致超时。
解法二:
开辟一个新的数组,计算旋转后各个元素的新位置。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
k = k % nums.size();
if(k==0){
return;
}
int n = nums.size();
vector<int> temp(n);
for(int i= 0 ; i < n; i++){
temp[(i+k)%n]=nums[i];
}
nums=temp;
}
};
这个方法阔以通过,但是开辟了新的空间。
题目要求三种方法,由于鄙人实在太菜了写不出来,所以贴个博客:
https://blog.csdn.net/java_liuguoyao/article/details/86556839