题目描述:
给定长度为 n 的字符串,将字符串的前 m 个字符移动到字符串的尾部。
例: n = 6,m = 3,s = "abcdef ",移动之后得到 s = "defabc".
法一:暴力
先实现移动一个字符,再进行 m 次循环
void move_one(char* s,int n)
{
char t = s[0];
for(int i=1; i<n; ++i)
s[i-1] = s[i];
s[n-1] = t;
}
void move_many(char* s,int n,int m)
{
while(m--){
move_one(s,n);
}
}
容易看出复杂的为: O(m*n)
完整代码:
#include <bits/stdc++.h>
using namespace std;
void move_one(char* s,int n)
{
char t = s[0];
for(int i=1; i<n; ++i)
s[i-1] = s[i];
s[n-1] = t;
}
void move_many(char* s,int n,int m)
{
while(m--){
move_one(s,n);
}
}
int main(){
char s[105];
int m,n;
cin >> n >> m;
cin >> s;
move_many(s,n,m);
cout << s << endl;
return 0;
}
法二:三步反转法
将字符串分为两部分前 m 个字符为X,后面 n-m 个字符为Y
先将X、Y分别反转,再整体反转。
void Reverse_String(char* s,int start,int end)
{
char t = s[start];
while(start < end){
t = s[start];
s[start] = s[end];
s[end] = t;
start++;
end--;
}
}
复杂度为:O(n)
完整代码:
#include <bits/stdc++.h>
using namespace std;
void Reverse_String(char* s,int start,int end)
{
char t = s[start];
while(start < end){
t = s[start];
s[start] = s[end];
s[end] = t;
start++;
end--;
}
}
int main(){
char s[105];
int m,n;
cin >> n >> m;
cin >> s;
Reverse_String(s,0,m-1); //反转字符串 X
Reverse_String(s,m,n-1); //反转字符串 Y
Reverse_String(s,0,n-1); //整体反转
cout << s << endl;
return 0;
}