实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
AC代码1:传值
#include<stdio.h>
void Left_circle(char* a, int n)
{
int i = 0;
int len = strlen(a);
char ret;
n %= len;
while (n--)//控制次数
{
ret = a[0];
for (i = 0; i < len; i++)
{
if (4 == i)
{
a[i] = ret;
}
if (i <= 3)
{
a[i] = a[i + 1];
}
}
}
}
int main()
{
char a[] = "ABCDE";
int n = 0;
scanf("%d", &n);
Left_circle(a, n);
printf("%s\n", a);
return 0;
}
AC代码2:传址
#include <stdio.h>
#include <assert.h>
void reverse_arr(char* src, int k)
{
char tmp;
assert(src != NULL);
while (k--)
{
char* cur = src; //创建临时变量,防止src被改变
tmp = *cur;
while (*(cur + 1) != '\0')//用'\0'控制转换结束
{
*cur = *(cur + 1);
cur++;
}
*cur = tmp;
}
}
int main()
{
char arr[] = "ABCDE";
int k = 0;
scanf("%d", &k);
reverse_arr(arr, k);
printf("%s\n", arr);
return 0;
}
🐂AC代码3:逆序函数(大牛想的)
#include <stdio.h>
#include <assert.h>
void reverse(char* left, char* right)//创建一个翻转函数
{
assert((left != NULL) && (right != NULL));//断言,检查参数的有效性
while (left < right)
{
char tmp = *right;
*right = *left;
*left = tmp;
left++;
right--;
}
}
void reverse_arr(char* src, int k)
{
int j = strlen(src);
reverse(src, src + k - 1); //翻转前k个元素
reverse(src + k, src + j - 1);//翻转k后面元素
reverse(src, src + j - 1); //整体翻转
}
int main()
{
char arr[] = "ABCDE";
int k = 0;
scanf("%d", &k);
reverse_arr(arr, k);
printf("%s\n", arr);
return 0;
}
🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄🌄
再来练习一下叭~~
题目:
字符串旋转结果
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
AC代码(穷举~)
#include <stdio.h>
#include<string.h>
void left_move(char* s1, int k)//一个参数为字符串首地址,一个是移动的偏移量
{
while (k--)
{
char* str = s1;
char tmp = *str;
while ((*(str + 1)) != '\0')
{
*str = *(str + 1);
str++;
}
*str = tmp;
}
}
int judge_function(char* s1, const char* s2)//一个参数为字符串首地址,还有一个是比较的字符串首地址
{
int i = 0;
if (strlen(s1) != strlen(s2))
{
return 0;
}
else
for (i = 0; i < strlen(s1); i++)
{
left_move(s1, 1);
if (strcmp(s1, s2) == 0)//strcmp函数判断旋转后的s1字符串是否与s2字符串相同
{
return 1;
}
}
return 0;
}
int main()
{
char s1[] = "AABCD";
char s2[] = "BCDAA";
char s3[] = "abcd";
char s4[] = "ACBD";
char s5[] = "AABCD";
char s6[] = "BCDA";
int res1 = judge_function(s1, s2);
int res2 = judge_function(s3, s4);
int res3 = judge_function(s5, s6);
printf("%d\n", res1);
printf("%d\n", res2);
printf("%d\n", res3);
return 0;
}
AC代码(追加字符串~)
说明:(详情见C语言进阶03)
我们发现在原来的字符串后面加一个一样的字符串之后,就不需要穷举,例如:我们想看ABCDA是不是s1旋转后的字符串,只要在此追加的字符串中看是否能找到即可......
char s1[] = "AABCD";
//AABCDAABCD
例如:在字符串后面追加一个字符串是这样写的,函数strcat( arr1,"defg");【strcat函数用于将b字符串追加到a字符串的情况】
strncat(arr1, arr1, 3);用于字符串自己给自己追加的情况
strstr(arr1,arr2);用来判断arr2是否在arr1中,如果在,则返回的是第一个和arr2一样的元素的地址;否则,返回的是NULL;比如:
arr1是“AABCDAABCD”,arr2是“BCD”,则返回的是第一个BCD中的‘B’;如果arr1是“AABCDAABCD”,arr2是“BCE”,则arr1中没有,返回的是NULL
#include <stdio.h>
#include <assert.h>
int is_left_move(char arr1[], char arr2[])
{
assert(arr1);
assert(arr2);
int len1 = strlen(arr1);
int len2 = strlen(arr2);
if (len1 != len2)//避免,两个字符串长度都不一样的无效比较
{
return 0;
}
//1.给arr1后面追加一个arr1中的字符串
strncat(arr1, arr1, len1);
//2.判断arr2是否是arr1中的字符串
if (strstr(arr1, arr2) == NULL)
{
return 0;
}
return 1;
}
int main()
{
char arr1[20] = "AABCD";
//AABCDAABCD
char arr2[] = "BCDAA";
int ret = is_left_move(arr1, arr2);
if (ret == 1)
{
printf("YES\n");
}
else
printf("NO\n");
return 0;
}