✨题目
给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
✨样例
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]
✨提示
- 1 <= nums.length <= 10**5**
- -2**31 <= nums[i] <= 231**- 1
- 0 <= k <= 10**5**
✨解题
方法一:暴力循环
把最后一个元素取出来,然后将前面的元素依次往后挪一位进行覆盖,然后把取出来的元素填到第一位上去,重复 k 次即可。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int len = nums.size();
for(int i = 1;i <= k;i++){
int number = nums[len-1];
for(int j = len-1;j >= 1;j--){
nums[j] = nums[j-1];
}
nums[0] = number;
}
}
};
但是根据题目提示的数据量来看,105 * 105 的数据量估计会被卡时间<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/21436600/1636644466219-48ebc919-188e-4773-aae0-e0bed1ae9e00.png#clientId=u3ae378cc-e379-4&from=paste&height=79&id=uaea4cac3&originHeight=157&originWidth=1553&originalType=binary&ratio=1&size=15394&status=done&style=none&taskId=u414443b1-6c29-48bf-89ff-ecf6fe24403&width=776.5)
方法二:翻转数组
class Solution {
public:
void reverse(vector<int>& nums,int left,int right){
while(left < right){
swap(nums[left],nums[right]);
left++;
right--;
}
}
void rotate(vector<int>& nums, int k) {
int len = nums.size();
reverse(nums,0,len-1);
reverse(nums,0,(k % len)-1);
reverse(nums,k % len,len-1);
}
};