字符串左旋
Posted 再吃一个橘子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串左旋相关的知识,希望对你有一定的参考价值。
实现一个函数,可以左旋字符串中的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;
}
以上是关于字符串左旋的主要内容,如果未能解决你的问题,请参考以下文章