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函数能否派上用场。