LeetCode 189.轮转数组
pta 基础编程题集 7-31字符串循环左移
思路:
左移:
解法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:
“这个世界看上去是灰暗的,没有梦中那么五彩斑斓,但是总有一些光亮在等着你。哪怕是一些小小的瞬间,也值得你活下去。”
“我呢,也不用低声下气的,你呢也不用那么过分懂事。不想笑你就别笑,想哭你就大声哭出来。到那时候再也不用讨好别人,不用为别人活着。”
“明明自己都还没活明白,却还想着要逞英雄”
“醒醒,散场了。”
“献给走过长夜的人。”