问题描述:
给定一个字符串,要求将字符串前面的若干个字符移动到字符串尾部
例:将abcdef前3个字符 a b c移到字符串尾部,原字符串变成defabc
解法一(暴力移位):
- 每次将字符串首字符移动到字符串尾部(循环若干次)
void LeftShiftOne(char *s,int n)
{
int t = s[0];//保存起始值
for(int j=1;j<n;j++)
{
s[j-1] = s[j];
}
s[n-1] = t;//移到最后一位
}
void LeftRotateString(char *s,int n,int m)
{
while(m--)
{
LeftShiftOne(s,n);
}
}
int main()
{
char str[] = "abcdef";
int n = strlen(str);
int m = 3;
LeftRotateString(str,n,m);
cout<<str<<endl;
return 0;
}
解法二(三步反转):
- 将原字符串分为X和Y两个部分,其中X为abc Y为def
- 将X的所有字符串反转 abc->cba 将Y的所有字符串反转 def->fed
- 将上述步骤得到的结果整体反转 cbafed -> defabc
void ReverseString(char *str,int from,int to)
{
while(from < to)
{
int t = str[from];
str[from++] = str[to];
str[to--] = t;
}
}
void LeftRotateString(char *str,int n,int m)
{
ReverseString(str,0,m-1);//反转X
ReverseString(str,m,n-1);//反转Y
ReverseString(str,0,n-1);//整体反转
}
int main()
{
char str[] = "abcdef";
int n = strlen(str);
int m = 3;
LeftRotateString(str,n,m);
cout<<str<<endl;
return 0;
}
实战:
反转英文句子 eg:I am a student. 输出 :student. a am I
先反转整个句子 .tneduts a ma I
从前往后每个单词反转 student. a am I
void Reverse(char *arr,int left,int right)
{
while(left < right)
{
char t = arr[left];
arr[left++] = arr[right];
arr[right--] = t;
}
}
void ReverseWorld(char *str,int n)
{
if(str == NULL || n <= 1) return ;
int left = 0;
int right = n-1;
//整体反转
Reverse(str,left,right);
//从前往后每个单词反转
left = 0;
right = 0;
while(right < n)
{
if(str[left] == ' ')
{
left++;
right++;
}
if(str[right] == ' ')
{
Reverse(str,left,--right);
left = ++right;
}
else
{
right++;
}
}
}
int main()
{
char str[] = "I am a student.";
int n = strlen(str);
ReverseWorld(str,n);
cout<<str<<endl;
}
进阶算法…