旋转字符串 旋转字符串

「这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

旋转字符串

字符串左旋

实现一个函数,可以左旋字符串中的k个字符。

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

题前认知:

一个字符串如果就定死了。eg:char arr[]=“dfdf”什么的那多没意思,一点都没有人机交互的感觉,(虽然现在人机交互适合个体,不适合集群,但也是比死板的定死字符串舒服)

所以字符串得是我们可输入的,才有可玩性,玩的不尽性就循环

暴力移位:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
c复制代码#include<stdio.h>
#include<string.h>

char* turn_left(char* arr, int num)
{
int len = strlen(arr);
int i = 0;
//左旋数是多少就进行几次移位
for (i = 0; i < num; i++)
{
//每次移位就是单次左旋
int j = 0;
char tmp = arr[0];//每次都把首元素存起来
for (j = 0; j < len-1; j++)
{
arr[j] = arr[j + 1];
}
arr[len-1] = tmp;//把存起来的首元素放到最后一位
}
return arr;
}

int main()
{
char arr[100] = {0};
int num = 0;
while (1)
{
printf("请输入想要旋转的字符串:>");
gets(arr);
printf("请输入想要左旋数:>");
scanf("%d", &num);
getchar();//这个的作用是清空缓冲区,因为每次scanf会有一个\n,不清空的话
//下一次到了gets,他会认为\n是我们打进去的,所以scanf之后必须清空缓冲区
printf("左旋字符串为:%s\n", turn_left(arr, num));
}
return 0;
}

输出结果

image-20210909232922661

三步翻转:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
c复制代码#include<stdio.h>
#include<string.h>
#include<assert.h>

void reverse(char* head, char* tail) //字符串逆序
{
assert(head && tail);//断言阻止空指针
char tmp = 0;
char* ptmp = &tmp;
while (head<tail)
{
tmp = *head;
*head = *tail;
*tail = tmp;
head++;
tail--;
}
return 0;
}
char* turn_left(char* arr, int num)
{
assert(arr);
int len = strlen(arr);
if (len)
{
int n = num % len; //防止num会越界操作,所以必须是num模len才可,还要保证len不为0
reverse(arr, &arr[n - 1]); //逆序左边
reverse(&arr[n], &arr[len - 1]); //逆序右边
reverse(arr, &arr[len - 1]); //逆序整体
return arr;
}
else
{
return arr;
}
}

int main()
{
char arr[100] = {0};
int num = 0;
while (1)
{
printf("请输入想要旋转的字符串:>");
gets(arr);
printf("请输入想要左旋数:>");
scanf("%d", &num);
getchar();//这个的作用是清空缓冲区,因为每次scanf会有一个\n,不清空的话
//下一次到了gets,他会认为\n是我们打进去的,所以scanf之后必须清空缓冲区
printf("左旋字符串为:%s\n", turn_left(arr, num));
}
return 0;
}

image-20210910003317406

image-20210910100918779

还有3种方法但那三种就需要很强的数学功底了,具体的我也看不懂他怎么证明的数学公式,就不看了。哈哈哈

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%