在C语言的学习过程中,字符串是我们经常会遇到的,并且对字符串的一些操作、变化、改变都是我们应该做注重的。其中我认为一个比较有特色的变化就是对字符串进行左旋或者右旋。
左旋如下:
一个字符串为 abcd1234
左旋两位以后应该为 cd1234ab
右旋同理:
一个字符串为 abcd1234
右旋两位以后应该为 34abcd12
这时候我们发现,右旋与左旋其实有相似之处,右旋两次相当于左旋了六次。所以,这里我们就以左旋为例。
方法一:字符串左旋三次,我们分步进行,先让字符串左旋一次,得到结果以后,再让字符串左旋一次,循环进行,直至要求的左旋次数即可。
如下图:
此时的 d1234abc 就是目的左旋字符串,其代码如下。
void reverse_left_1(char *str, int n, int len)
{
int i = 0, j = 0;
char temp = 0;
n %= len;//判断左旋的有效次数
for (i = 0; i < n; i++)//左旋的总次数
{
temp = str[0];//保存第一个元素
for (j = 0; j < len - 1; j++)//左旋一次
{
str[j] = str[j + 1];//将后一位元素放置其前一位
}
str[j] = temp;//将第一个放置最后一个,完成左旋一次后的结果
}
}
int main()
{
char str[] = "abcd1234";
int n = 0, len = strlen(str);
printf("please enter->");
scanf("%d", &n);//输入左旋的次数
printf("before reverse_left string is :%s\n", str);
reverse_left_1(str, n, len);
printf("reverse_left string is :%s\n", str);
system("pause");
return 0;
}
方法二:分段进行操作,先将字符串按照左旋次数进行分段,接着分别将两段字符串进行逆置,然后再将字符串整体逆置即可。
如下图:
此时的 d1234abc 就是目的左旋字符串,其代码如下。
void swap(char *start, char *end)
{
while (start < end)
{
*start ^= *end;
*end ^= *start;
*start ^= *end;
start++, end--;
}
}
void reverse_left_2(char *str, int n, int len)
{
char *mid = NULL;//定义一个指针,将指向左旋分段点
n %= len;//判断左旋的有效次数
mid = str + n - 1;//指向分段点的最后一个字符
swap(str, mid);//逆置前一段字符串
swap(mid + 1, str + len - 1);//逆置后一段字符串
swap(str, str + len - 1);//整个字符串逆置
}
int main()
{
char str[] = "abcd1234";
int n = 0, len = strlen(str);
printf("please enter->");
scanf("%d", &n);//输入左旋的次数
printf("before reverse_left string is :%s\n", str);
reverse_left_2(str, n, len);
printf("reverse_left string is :%s\n", str);
system("pause");
return 0;
}
方法三:将原字符串自身与自身进行拼接形成长串,此时的长串内包含所有可能左旋的结果,在其中进行筛选读取即可。
如图:
此时的 d1234abc 就是目的左旋字符串,其代码如下。
void reverse_left_3(char *str, int n, int len)
{
char str1[32];//创建一个新的字符数组来存放将来的长串
n %= len;//判断左旋有效次数
strcpy(str1, str);//将原串先拷入新的字符数组
strcat(str1, str);//两个原串连接
strncpy(str, str1 + n, len);//读取左旋后的目的字符串
}
int main()
{
char str[] = "abcd1234";
int n = 0, len = strlen(str);
printf("please enter->");
scanf("%d", &n);//输入左旋的次数
printf("before reverse_left string is :%s\n", str);
reverse_left_3(str, n, len);
printf("reverse_left string is :%s\n", str);
system("pause");
return 0;
}
本人愚见,欢迎大家共同探讨研究,如果错误,请及时联系作者进行修改更正,谢谢大家!