题型:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
解法一:借助中间数组
``` c++
void rotate(vector<int>& nums, int k) {
vector<int>res(nums.size());
for(int i = 0;i < nums.size() ;++i)
{
res[(i+k)%nums.size()] = nums[i];
}
nums = res;
}
```
解法二:使用reverse函数三次变换,第二、三次将数组根据k值,将数组分开颠倒,其实合起来是将数组来回颠倒了两回。
void rotate(vector<int>& nums, int k) %%reverse() 元素翻转
{
k = k %(nums.size());
std::reverse(nums.begin(),nums.begin()+nums.size()-k);
std::reverse(nums.begin()+nums.size()-k,nums.end());
std::reverse(nums.begin(),nums.end());
}
解法三:使用 push_back 和erase函数
void rotate(vector<int>& nums, int k) {
int n = nums.size();
int m;
m = n - k;
for(int i = 0; i < m ;i++)
nums.push_back(nums[i]);
nums.erase(nums.begin(),nums.begin()+m);
}
解法四:(最快的算法)迭代器与insert,根据k在数组前插入数字,然后用resize来重新约束数组大小
void rotate(vector<int>& nums, int k) {
vector<int>::size_type size = nums.size();
int real_k = k % size;
vector<int>::iterator f_iter = nums.end() - real_k; %% 定义向量迭代器
nums.insert(nums.begin(), f_iter, nums.end());
nums.resize(size);
}
insert三种使用
- //用法1:在指定位置it前“插入”值为val的元素,返回指向这个元素的迭代器,
- iterator insert( iterator it, const TYPE &val );
- //用法2:在指定位置it前“插入”num个值为val的元素
- void insert( iterator it, size_type num, const TYPE &val );
- //用法3:在指定位置it前“插入”区间[start, end)的所有元素.
- void insert( iterator it, input_iterator start, input_iterator end );