2023.9.3
k的取值范围为0~100000,此时需要考虑到两种情况,当k为0时,此时数组不需要轮转,因此直接return返回;当k大于等于数组nums的大小时,数组将会转为原来的数组,然后再接着轮转,此时可以先处理一下k值:k = k % nums.size(); 接下来再构造一个新数组用来装轮转过后的元素值即可。 代码如下:
class Solution {
public:void rotate(vector<int>& nums, int k) {k = k % nums.size(); //k可能大于nums.size()if(k == 0) return;vector<int> ans(nums.size());int seg = nums.size()-k;int j = 0;for(int i=seg; i<nums.size(); i++){ans[j] = nums[i];j++;}for(int i=0; i<seg; i++){ans[j] = nums[i];j++;}nums = ans;}
};
优化:本题数组可以原地修改。
class Solution {
public:void rotate(vector<int>& nums, int k) {k = k % nums.size();reverse(nums.begin(),nums.end());reverse(nums.begin(),nums.begin()+k);reverse(nums.begin()+k,nums.end());}
};
ps:看到需要反转的题,可以考虑一下reverse函数能否派上用场。