1. 左旋字符串多种实现方法或写法
  2. 判断一个字符串旋转后是否为另一个字符串的字串
    什么是左旋字符串: 将第一个字符存放起来,然后将第二个至最后一个字符依次向前挪一位,再将第一个字符放在末尾。我的理解简单来说就是:左边要旋转的几个字符放在了后面
    思路:写一个左旋一次的函数,然后需要左旋几次,就调用几次这个函数


左旋字符串多种实现方法或写法:

在这里插入代码片
方法一:
#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)

               	                                                                       	

更多推荐

左旋字符串问题