左旋

1.实现一个函数,可以左旋字符串中的k个字符。 
ABCD左旋一个字符得到BCDA 
ABCD左旋两个字符得到CDAB 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void zuoxuan_arr1(char *arr,int sz,int X)
{
	int i=0;
	int j=0;
	X %=sz;
	for(i=0;i<X;i++)
	{
		char temp=arr[0];//先把第一个数存起来
		for(j=0;j<sz-1;j++)
		{
			arr[j]=arr[j+1];//将后面的输依次向前
		}
		arr[sz-2]=temp;//再把存起来的第一个放到最后一位
	}
}
void reserve_string(char * left,char *right)
{
	while(left<right)
	{
		*left^=*right;
		*right^=*left;
		*left^=*right;
		left++;
		right--;
	}
}

void zuoxuan_arr2(char *arr,int sz,int x)
{
	char *start = arr;//定义一个起始指针指向数组的首元素
	char *end = arr+sz-1;//定义一个末位地址指向最后一个元素
	char *mid = NULL;//定义一个中间指针
	x %=sz;//左旋的有效次数,比如长为8的数组左旋100次,前96次其实就相当于无效的,所以就等于左旋了4次
	mid = arr+x-1;//如果左旋x位,那么mid则指向第n个元素
	reserve_string(start,mid);//首先将前半部分逆置。例:abcd1234,左旋3位。结果:cbad1234
	reserve_string(mid+1,end);//再将后半部分逆置---------------------------------cba4321d
	reserve_string(start,end);//最后将整体逆置-----------------------------------d1234abc
}
void zuoxuan_arr3(char *arr,int sz,int x)//双倍字符串法
{
	char *buff = (char *)malloc(2*sz+1);//创建一个新的空间,大小为arr的长度的2倍加上‘\0’
	if(!buff)//如果创建空间失败那么直接返回
	{	
		return;
	}
	else
	{
		x %=sz;//左旋的有效次数,比如长为8的数组左旋100次,前96次其实就相当于无效的,所以就等于左旋了4次
		strcpy(buff,arr);//把arr拷贝到buff中
		strcat(buff,arr);//在buff中再衔接一个arr,那么此时buff中是两个arr连接在一起的结果
		strncpy(arr,buff+x,sz);//buff+x,为buff中第x+1元素的地址
		//左旋n个:从buff的第n+1个元素往后的sz个元素赋给arr
	}
}
int main()
{
	char arr[]="ABCDEFG";
	int x=0;
	int sz=sizeof(arr)/sizeof(arr[0]);
	scanf("%d",&x);//输入旋转的位数
	/*zuoxuan_arr1(arr,sz,x);
	printf("%s\n",arr);*/
	/*zuoxuan_arr2(arr,strlen(arr),x);
	printf("%s\n",arr);*/
	zuoxuan_arr3(arr,strlen(arr),x);
	printf("%s\n",arr);
	system("pause");
	return 0;
}

2.判断一个字符串是否为另外一个字符串旋转之后的字符串。 
例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0. 


AABCD左旋一个字符得到ABCDA 
AABCD左旋两个字符得到BCDAA 

AABCD右旋一个字符得到DAABC 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int  compare(char *arr1,char *arr2,int sz1,int sz2)
{
	int i=0;
	int j=0;
	for(i=0;i<sz1;i++)
	{
		char temp=arr1[0];
		for(j=0;j<sz1-1;j++)
		{
			arr1[j]=arr1[j+1];
		}
		arr1[sz1-2]=temp;
		if(*arr1==*arr2)
		{
			return 1;
		}
	}
	return 0;
}
char* double_arr1(char *arr,int sz)//双倍字符串法
{
	char *buff = (char *)malloc(2*sz+1);//创建一个新的空间,大小为arr的长度的2倍加上‘\0’
	if(!buff)//如果创建空间失败那么直接返回
	{
		return;
	}
	else
	{
		strcpy(buff,arr);//把arr拷贝到buff中
		strcat(buff,arr);//在buff中再衔接一个arr,那么此时buff中是两个arr连接在一起的结果
	}
	return buff;
}
int my_strstr(char *buff,char *arr2)
{
	char *longp1 = buff;
	char *shortp =arr2;
	char *s1 = NULL;
	if (*arr2=='\0')
	{
		return 0;//不是
	}
	while(*longp1)
	{
		s1 =  longp1;
		shortp = arr2;
		while(*s1&&*shortp&&(*s1==*shortp))
		{
			s1++;
			shortp++;
		}
		if(*shortp=='\0')
		{
			return 1;//是子串
		}
		longp1++;
	}
	return -1;//不是
}
int main()
{
	char arr1[]="CBDA";
	char arr2[]="ACBD";
	int ret=0;
	char *buff =double_arr1(arr1,strlen(arr1));
	ret = my_strstr(buff,arr2);
	if(ret==1)
	{
		printf("是\n");
	}
	else
	{
		printf("不是\n");
	}
	//char arr1[]="abcd";
	//char arr2[]="ACBD";
	//int ret=0;
	//int sz1=sizeof(arr1)/sizeof(arr1[0]);
	//int sz2=sizeof(arr2)/sizeof(arr2[0]);
	//ret=compare(arr1,arr2,sz1,sz2);
	//if(ret==1)//如果返回1则是
	//{
		// printf("是\n");
	//}
	//else//如果返回0则不是
	//{
		// printf("不是\n");
	//}
	system("pause");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值