题目:轮转数组
因为轮转的特性,每当移动的次数是数组大小的整数倍时,就相当于完全没有变化,使所以直接返回
1// 解法一:
2void rotate(vector<int>& nums, int k)
3{
4 int sz = nums.size();
5 if(k % sz == 0) return;
6
7 std::vector<int> vec(sz, 0);
8 for(int i = 0; i < sz; i++)
9 {
10 int index = (i + k) % sz;
11 vec[index] = nums[i];
12 }
13 nums = vec;
14}
参考了这里的解法:189. 轮转数组 - 力扣(LeetCode)
假设现在有一个数组[1,2,3,4,5,6,7],需要变换成[5,6,7,1,2,3,4]
可以将转换后的数组视为:[5,6,7] + [1,2,3,4]
首先要确保的是[5,6,7]在[1,2,3,4]前面,这可以通过翻转整个数组得到——> [7,6,5,4,3,2,1]
之后就只需要对[7,6,5] 和 [4,3,2,1]两个子数组进行翻转就可以得到最终的结果
1// 解法二:
2void rotate(vector<int>& nums, int k)
3{
4 k %= nums.size();
5 ranges::reverse(nums);
6 std::reverse(nums.begin(), nums.begin() + k);
7 std::reverse(nums.begin() + k, nums.end());
8}
来源:语雀原笔记