转轮数组
1、题目要求
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
输入: 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、题解
1 class Solution {
2 public:
3 void rotate(vector<int>& nums, int k) {
4 vector<int>lunzhuan;
5 if(k > 0)
6 {
7 for(int i = 0; i < nums.size(); ++i)
8 {
9 if(i < k)
10 {
11 lunzhuan.push_back(nums[nums.size()+i-k]);
12 }
13 else
14 {
15 lunzhuan.push_back(nums[i-k]);
16 }
17 }
18 nums.swap(lunzhuan);
19 }
20
21 }
22 };
报错:可能存在k大于数组长度,如果 k
大于 nums
的长度,直接使用 k
会导致索引越界。旋转等效次数应该是 k % nums.size()
增加 k %= nums.size();
1 class Solution {
2 public:
3 void rotate(vector<int>& nums, int k) {
4 vector<int>lunzhuan;
5 k %= nums.size();
6 if(k > 0)
7 {
8 for(int i = 0; i < nums.size(); ++i)
9 {
10 if(i < k)
11 {
12 lunzhuan.push_back(nums[nums.size()+i-k]);
13 }
14 else
15 {
16 lunzhuan.push_back(nums[i-k]);
17 }
18 }
19 nums.swap(lunzhuan);
20 }
21
22 }
23 };
方法二、
1 class Solution {
2 public:
3 void rotate(vector<int>& nums, int k) {
4 int n = nums.size();
5 k %= nums.size();
6 reverse(nums.begin(),nums.end());
7 reverse(nums.begin(),nums.begin()+k);
8 reverse(nums.begin()+k,nums.end());
9 }
10 };
问题1:reverse函数的使用说明
在 C++ 中,reverse()
函数接受两个迭代器作为参数,分别表示反转区间的开始和结束。
这个区间遵循半开半闭的原则,即包含起始位置的元素,但不包含结束位置的元素。因此,当你调用
reverse(nums.begin(), nums.begin() + k);
时,它会反转从 nums.begin()
开始的 k
个元素,实际上反转的是 [0, k-1]
的索引区间。
紧接着,当你调用
reverse(nums.begin() + k, nums.end());
时,意图是反转从索引 k
到数组末尾的元素。由于区间是左闭右开的,因此这个调用实际上反转的是从 k
开始到 n-1
(其中 n
是 nums.size()
)的元素,即索引区间 [k, n-1]
。
问题2:reverse(nums.begin(), nums.end())的原理
reverse()
函数和大多数 STL 算法遵循半开半闭区间原则(即,包括开始迭代器指向的元素,但不包括结束迭代器指向的元素)。这种设计允许算法能够以统一的方式处理空容器和非空容器,同时简化了边界条件的处理。
当我们调用 reverse(nums.begin(), nums.end());
时,实际上是要反转从 nums.begin()
开始到 nums.end()
之前的所有元素。这里的 nums.end()
并不指向数组的最后一个元素,而是指向最后一个元素之后的“假想”位置。因此,即便按照半开半闭的原则,这个范围仍然涵盖了数组中的所有元素。
简而言之,nums.end()
并不指向任何实际的元素,而是作为一个标记,表示数组末尾元素的下一个位置。这就是为什么 reverse(nums.begin(), nums.end());
能够反转整个数组而不漏掉最后一个元素的原因。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律