☰
轮转数组--力扣100
2026/10/14 19:29:35 网站建设 项目流程

1、题目描述:

给定一个整数数组 nums,将数组中的元素向右轮转 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、本人题解:

最原始移动 注意学习越界问题!!!!

class Solution { public: void rotate(vector<int>& nums, int k) { vector<int>vk(k,0); if(n==0)return;//n==0时 k%=n会崩溃! k%=n;//k>n时取余 保证n-k-1 >= -1 越界问题 if(k==0)return;//减少无用功 但不加也没关系 int n=nums.size(); for(int i=0;i<k;i++){ vk[i]=nums[n-k+i];//移出去的几个 } for(int i=n-k-1;i>=0;i--){ nums[i+k]=nums[i];//后移 } for(int j=0;j<k;j++){ nums[j]=vk[j]; } } };

3、更好题解学习:

(1)、三次反转

原数组: 1 2 3 4 | 5 6 7
整体翻转: 7 6 5 | 4 3 2 1
翻转前 k 个: 5 6 7 | 4 3 2 1
翻转后 n-k 个:5 6 7 | 1 2 3 4 ← 结果

//三次反转 class Solution { public: void rotate(vector<int>& nums, int k) { int n=nums.size(); if(n==0)return;//!! k%=n; reverse(nums.begin(),nums.end());//第一次反转 reverse(nums.begin()+k,nums.end());//反转【k,n) reverse(nums.begin(),nums.begin()+k);//反转【0,k) 注意后是开区间 } };

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询