实现字符串的左旋

实现一个函数,可以左旋字符串中的k个字符。

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

小编想说刚拿到这个题目各位友友会觉得这个题目非常的简单,我们可能会利用循环思想先打印左旋k个字符之后的字符再打印左旋的k的字符。

#include<stdio.h>
#include<string.h>
void Left(char* p, int a,int len)
{
	for (int i = a; i < len; i++)
		printf("%c", *(p + i));
	for (int i = 0; i < a; i++)
		printf("%c", *(p + i));
}
int main()
{
	char ch[50] = { 0 };
	gets_s(ch);
	int lenth = strlen(ch);
	int b = 0;
	printf("可以左旋字符串中的几个字符:");
	scanf("%d",&b);
    b%=lenth;//长度为5时可能旋转6次也就是旋转1次
	Left(ch,b,lenth);
	return 0;
}

但小编想说这样子想是可以将题目写出来,但小编想为各位友友提供其他方法。

1.设计循环是字符串左旋一次,执行k次。

首先写出函数主体

#include<stdio.h>
int main()
{
    char ch[50]={0};//对字符串初始化
    gets_s(ch);
    int lenth = strlen(ch);
	int b = 0;
	printf("可以左旋字符串中的几个字符:");
	scanf("%d",&b);
    b%=lenth;
	Left(ch,b,lenth);
    return 0;
}

其次再来写左旋函数

void Left(char* p, int n, int lenth)
{
	for(int i=0;i<n;i++)//循环左旋k次
	{
		char tem = p[0];
		int j = 0;
		for (j = 0; j < lenth-1;j++)//左旋一次
		{
			p[j] = p[j + 1];
		}
		p[j] = tem;//循环结束后j++(j的值增加了1),所以千万别写成了p[j+1]=tem;
	}
}

2.利用字符库函数进行拼接

主体函数一样但以为要利用字符库函数进行拼接,所以要包含头文件#inlude<string.h>(友友们不要忘记了哦)

void Left(char* p, int n, int lenth)
{
	char tem[50] = { 0 };
	strcpy(tem, p + n);//先将后面的全部拷贝过来
	strncat(tem, p, n);//后将前面的连接在tem后面
	strcpy(p, tem);//再将tem里面的拷贝
}

3.分成三段进行左旋

//例如 ABCDEFG ,左旋3次后变成 DEFGABC, 有一个特殊的操作方式:
//先将要左旋的前三个家伙逆序( CBADEFG ),然后将后半段也逆序(CBAGFED),最后整体逆序( DEFGABC )即可。这样只需要做数值交换即可,可以写一个函数帮我们完成局部逆序,代码如下:
#include<stdio.h>
#include<string.h>
void reverse_part(char* p, int start, int end) //将字符串从 start 到 end 这一段逆序
{
	int i, j;
    char tmp;
   for (i = start, j = end; i < j; i++,j--)
   {
	   tmp = p[i];
	   p[i] = p[j];
	   p[j] = tmp;
   }
 }
 void leftRound(char* p , int time)
{
	 int lenth = strlen(p);
	 int pos = time % lenth;
		 reverse_part(p, 0, pos - 1); //逆序前段
		 reverse_part(p,pos, lenth - 1);//逆序后段
		 reverse_part(p, 0, lenth - 1);//整体逆序
}
		

函数主体小编未给,小编懒惰虫上头了,下线了,希望各位友友能有所收获!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值