✨题目

给你一个数组,将数组中的元素向右轮转 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 次即可。

  1. class Solution {
  2. public:
  3. void rotate(vector<int>& nums, int k) {
  4. int len = nums.size();
  5. for(int i = 1;i <= k;i++){
  6. int number = nums[len-1];
  7. for(int j = len-1;j >= 1;j--){
  8. nums[j] = nums[j-1];
  9. }
  10. nums[0] = number;
  11. }
  12. }
  13. };
  1. 但是根据题目提示的数据量来看,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)

方法二:翻转数组

image.png

  1. class Solution {
  2. public:
  3. void reverse(vector<int>& nums,int left,int right){
  4. while(left < right){
  5. swap(nums[left],nums[right]);
  6. left++;
  7. right--;
  8. }
  9. }
  10. void rotate(vector<int>& nums, int k) {
  11. int len = nums.size();
  12. reverse(nums,0,len-1);
  13. reverse(nums,0,(k % len)-1);
  14. reverse(nums,k % len,len-1);
  15. }
  16. };