刷题总结-旋转容器

LeetCode 189.轮转数组

力扣

pta 基础编程题集 7-31字符串循环左移

PTA | 程序设计类实验辅助教学平台

思路:

左移:

解法1、暴力解法:

存储第一位的数据,然后其他的位数分别向前移动一位,最后把第一位的数据赋给最后一位,如pta题,可用以下代码实现

#include <bits/stdc++.h>
using namespace std;
int main(){
string a;
  getline(cin,a);
  int n,k;
  cin>>n;
  for(int i=0;i<n;i++){
    k=a[0];
  for(int j=0;j<a.size()-1;j++){
  a[j]=a[j+1];  
  }
    a[a.size()-1]=k;
    }
  cout<<a;
  return 0;
}

时间复杂度 O(nm) 其中n为移动个数,m为字符串长度。
空间复杂度 O(1)

解法2:三次逆转法

左转时 先逆转(0,k)范围的字符,然后再逆转那后面的字符,最后把整个字符逆转即为答案。

以pta题为例,代码如下:

#include <bits/stdc++.h>
using namespace std;
int main(){
string a;
  getline(cin,a);
  int n,k;
  cin>>n;
  for(int i=0;i<n;i++){
    k=a[0];
  for(int j=0;j<a.size()-1;j++){
  a[j]=a[j+1];  
  }
    a[a.size()-1]=k;
    }
  cout<<a;
  return 0;
}

时间复杂度:O(n) n为容器长度
空间复杂度: O(1) 原地算法

右移:

解法1: 暴力解法:

与左移类似,不过将储存第一位变为储存最后一位,左移操作变为右移操作,如LeetCode题代码:

class Solution {
public:
    void rotate(vector<int>& nums, int k) {int t;
for(int i=0;i<k;i++){
    t=nums[nums.size()-1];
  for(int j=nums.size()-1;j>0;j--){
  nums[j]=nums[j-1];  
  }
    nums[0]=t;
    }
    }
};

时间复杂度 O(nm) 其中n为移动个数,m为字符串长度。
空间复杂度 O(1)
此解法由于时间复杂度较大 无法通过LeetCode第37个测试点

解法2:三次逆转法

与左转基本相同,唯一的区别是先逆转整个容器,然后再逆转区间。代码如下:

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
       while(nums.size()<k) k-=nums.size();
reverse(nums.begin(),nums.end());
reverse(nums.begin(),nums.begin()+k);
reverse(nums.begin()+k,nums.end());
    }
};

时间复杂度:O(n) n为容器长度
空间复杂度: O(1) 原地算法

最后以几句电影台词结束今天的CSDN:

“这个世界看上去是灰暗的,没有梦中那么五彩斑斓,但是总有一些光亮在等着你。哪怕是一些小小的瞬间,也值得你活下去。”
“我呢,也不用低声下气的,你呢也不用那么过分懂事。不想笑你就别笑,想哭你就大声哭出来。到那时候再也不用讨好别人,不用为别人活着。”
“明明自己都还没活明白,却还想着要逞英雄”
“醒醒,散场了。”
“献给走过长夜的人。”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧 渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值