-
比如给定一个一个字符串abcdef,m=2,那么左旋转之后的字符串味cdefab
-
第一种方法保存第一个字符key,其他字挨个挨个的前移,最后key放到最后即可。
-
实现代码如下:
-
#include
using namespace std;
void leftCircleStr(char *str, int m)
{
int len = strlen(str);
cout << len << endl;
for (int i = 0; i < m; i++)
{
char key = str[0];
for (int j = 1; j < len; j++)
{
str[j - 1] = str[j];
}
str[len - 1] = key;
}
}
int main()
{
char str[20] = “abcdefg”;
leftCircleStr(str, 2);
cout << str << endl;
system(“pause”);
return 0;
}
第二种方法,我们可以要把字符串分为XY两部分,X是要移动到Y后面的元素。XT是把X翻转(比如abc 转换为cba),(XT)T=X。我们需要求得就是YX。(XTYT)T=(YT)T(XT)T=YX了。操作就是我们先把X翻转,Y翻转,然后把整体字符串翻转,然后再把Y翻转X翻转。即可。
直接给出代码:
#include
using namespace std;
void leftCircleStr(char *str, int m)
{
int len = strlen(str);
cout << len << endl;
for (int i = 0; i < m; i++)
{
char key = str[0];
for (int j = 1; j < len; j++)
{
str[j - 1] = str[j];
}
str[len - 1] = key;
}
}
void reverseStr(char *begin, char *end)
{
while (begin < end)
{
char temp = *begin;
*begin = *end;
*end = temp;
begin++;
end–;
}
}
void leftCircleStr_T(char *str, int m)
{
int len = strlen(str);
char *begin1 = str;
char *end1 = str + m - 1;
char *begin2 = str + m;
char *end2 = str + len - 1;
reverseStr(begin1, end1);
reverseStr(begin2, end2);char *begin = str;
char *end = str + len - 1;
reverseStr(begin, end);
}
int main()
{
char str[20] = “abcdefg”;
leftCircleStr_T(str, 2);
cout << str << endl;
system(“pause”);
return 0;
}
第一种方法比较好理解比较好想到,第二种方法比较巧妙,利用类似于矩阵翻转的一些思想。很想巧妙。不过涉及到字符串翻转之类的问题,这个翻转的方法还是可以多考虑一下的啊。
直接过如下图所示:
左旋转字符串,给定一个字符串,把它的前M个字符放到它的尾部,其他字符依次前移
最新推荐文章于 2020-11-18 19:19:33 发布