- 左旋字符串多种实现方法或写法
- 判断一个字符串旋转后是否为另一个字符串的字串
什么是左旋字符串: 将第一个字符存放起来,然后将第二个至最后一个字符依次向前挪一位,再将第一个字符放在末尾。我的理解简单来说就是:左边要旋转的几个字符放在了后面
思路:写一个左旋一次的函数,然后需要左旋几次,就调用几次这个函数
左旋字符串多种实现方法或写法:
在这里插入代码片
方法一:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//void left_rotate(char arr[], int k)//数组接受,整型接受
void left_rotate(char* arr, int k)//数组接受,整型接受
//函数不需要返回值
{
int i = 0;//定义旋转的变量i来挪动字符
int len = strlen(arr);//求字符串长度
k %= len;//需要旋转的字符不超过len,优化代码
for (i = 1; i < k; i++)
{
char tmp = arr[0];//第一个元素保存放在tmp里面
int j = 0;
for (j = 0; j < len - 1; j++)//旋转len-1个字符
{
arr[j] = arr[j + 1];
}
arr[len - 1] = tmp;//把最后一个字符改成tmp,也就是改成旋转后的最后一个字符
}
}
int main()
{
char arr[] = "abcdef";//定义一串字符
int k = 0;//定义旋转的字符k
scanf("%d", &k);//输入旋转k个字符
left_rotate(arr, k);//传参,对arr数组旋转k个字符
printf("%s\n", arr);//打印旋转后的数组arr
return 0;
} 运行结果: ![在这里插入图片描述](https://img-blog.csdnimg.cn/87173f4fc1e841dc930f3f60e91b7f88.png)
方法二:
#include <stdio.h>
#include <assert.h>
#include <string.h>
// 常规做法 不够快
void LeftRound(char* str, int n)
{
//1 验证参数的合法性
assert(str != NULL);
//2 移动的步长
int len = strlen(str);
int step = n % len; // 步数取余 因为n=13时 就相当左移两位 1200是就在重复移动 所以取余就是移动的步数
//3 移动
while (step--!= 0)
{
char tmp = str[0];
for (int i = 0; i < len - 1; i++)
{
str[i] = str[i + 1];
}
str[len - 1] = tmp;
}
}
int main()
{
char str[] = "ABCD";
int n = 2;
LeftRound(str, n);
printf("%s\n", str);
return 0;
} 因为n=2,所以不用输入了,ABCD左旋2个字符,看下运行结果: ![在这里插入图片描述](https://img-blog.csdnimg.cn/236798c17e4d4d7ab6892bae3073f671.png)
方法三:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* left, char* right)//函数接受传入的左右两边元素的地址
{
assert(left && right);
while (left<right)//保证左边的元素小于右边的元素才能交换
{
//交换左右两边的字符
char tmp = *left;
*left = *right;
*left = tmp;
left++;
right--;
}
}
void left_rotate(char arr[], int k)
{
int len = strlen(arr);//字符串长度
k %= len;
reverse(arr, arr + k - 1);//逆序旋转字符k左边的字符
reverse(arr+k, arr + len- 1);//逆序旋转字符k右边的字符
reverse(arr, arr + len - 1);//逆序整个字符
}
int main()
{
char arr[] = "abcdef";//定义一串字符
int k = 0;//要旋转的字符个数
scanf("%d", &k);//输入旋转的字符个数k
left_rotate(arr, k);//函数传参arr,k
printf("%s\n", arr);//打印旋转后的数组元素arr
return 0;
} 运行结果: ![在这里插入图片描述](https://img-blog.csdnimg.cn/f1db9bf37d7c4a89bccdeac4bbd2d451.png) 判断一个字符串旋转后是否为另一个字符串的字串
方法一:#include<stdio.h>
#include<string.h>
int is_left_move(char arr1[], char arr2[])
{
int len1 = strlen(arr1);//求出字符串arr1的长度
int len2 = strlen(arr2);//求出字符串arr2的长度
len1 != len2;//如果字符串1和字符串2长度不相等就不可能旋转得来
return 0;
strncat(arr1, arr1, len1);//自己给自己追加字符串不包括'/0',所以用要用strncat
char* ret = strstr(arr1, arr2);
if (ret == NULL)
return 0;//找不到ret返回空指针也就是返回0
else
return 1;//找到了返回1
}
int main()
{
char arr1[20] = "abcdef";//定义一个可以存放20个字符的字符数组arr1
char arr2 []= "cdefab";//定义旋转后的字符arr2
//判断arr2的字符串是否可以通过arr1旋转得到
int ret = is_left_move(arr1, arr2);//ret来接收旋转的字符
if (ret == 1)//如果返回1就找到了呀!
print("ok\n");//找到打印ok
else
printf("No\n");
return;
} ![在这里插入图片描述](https://img-blog.csdnimg.cn/fe3aac7b0db5477db1644ac50d14438c.png)
方法二:#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdio.h>
void left_revolve(char* arr, int n, int len)
{
n = n % len;//需要旋转的字符不超过len,优化代码
int i = 0;
for (i = 0; i < n; i++)
{
char copy = arr[0]; //第一个元素保存放在copy里面
int j = 0;
for (j = 0; j < len - 1; j++)//旋转len-1个字符
{
arr[j] = arr[j + 1];
}
arr[j] = copy;//把最后一个字符改成copy,也就是改成旋转后的最后一个字符
//arr[len - 1] = copy;//把最后一个字符改成copy,也就是改成旋转后的最后一个字符
//其实这个len-1就是j的位置
}
}
//写一个判断的函数judge
void judge(char* arr1, char* arr2)
{
int ret = strcmp(arr1, arr2);//ret接收比较后的字符串大小
if (ret == 0)//如果相等返回
{
printf("判断结果:相同\n");
}
else
{
printf("判断结果:不相同\n");
}
}
int main()
{
int n = 0;
char arr1[] = "ABCD";
char arr2[] = "CDAB";
printf("左旋前:%s\n", arr1);
printf("判断字符串:%s\n", arr2);
int len = strlen(arr1);
printf("左旋几个字符:");
scanf("%d", &n);//输入要旋转的字符个数n
left_revolve(arr1, n, len);//给函数传参数arr1,n,len
printf("左旋后:%s\n", arr1);
judge(arr1, arr2);//judge函数判断字符串arr和字符串arr2是否相同
return 0;
} 方法二比方法一要复杂一些,但是实现起来怎么样我们来看下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/3ed960c9a6d94917a4cd1b2637c7aaab.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/f2de35dc33f941bd974cfa0c28f29d44.jpeg#pic_center)
更多推荐
左旋字符串问题
发布评论