给定一个整数数组 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:
输入:nums = [-1,-100,3,99], k = 2 输出:[3,99,-1,-100] 解释: 向右轮转 1 步: [99,-1,-100,3] 向右轮转 2 步: [3,99,-1,-100]
class Solution { public: void rotate(vector<int>& nums, int k) { int n = nums.size(); // 获取数组长度 k = k % n; // 处理 k 大于 n 的情况 reverse(nums.begin(),nums.end()); reverse(nums.begin(),nums.begin()+k); reverse(nums.begin()+k,nums.end()); } };
这里我要说一下这个取模的操作 一开始我是没有取模的 没有考虑全 以下我会解释为什么取模
假设我们用24小时制,当前时间是15:30(3:30 PM),我们想要加上2小时45分钟。直接相加,小时数变成17,分钟数变成75。但是,分钟数超过了60,我们需要调整这个时间。
1.处理分钟:
-
先加上分钟就是变成了 75分钟
-
由于一小时是60分钟 75分钟等于1小时15分钟 这里可以对分钟数取模 得到余数15 这个就是真是的分钟
2.处理小时
-
加上小时数(包括从分钟中得到的额外小时):15 + 2 + 1 = 18小时
-
对小时数取模24(因为一天有24小时),得到余数18,这就是最终的小时数(在这个特定例子中,小时数没有超出范围,所以直接就是18)