刷题学习 旋转数组

题型:给定一个数组,将数组中的元素向右移动 个位置,其中 是非负数。

解法一:借助中间数组

``` 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. //用法1:在指定位置it前“插入”值为val的元素,返回指向这个元素的迭代器,  
  2. iterator insert( iterator it, const TYPE &val );     
  3. //用法2:在指定位置it前“插入”num个值为val的元素   
  4. void insert( iterator it, size_type num, const TYPE &val );    
  5. //用法3:在指定位置it前“插入”区间[start, end)的所有元素.   
  6. void insert( iterator it, input_iterator start, input_iterator end );   

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值