C代码练习_18_11.1

关于字符串旋转:我们都知道在C语言中字符串是存在一串连续的空间中的。要想对字符串进行修改,
我们通常都是选择把字符串存在数组里,利用数组下标的控制来修改指定位置字符串的。
好了,思路大概就是这样让我们一起来看到题:
1.实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
根据我们刚才的思路呢,要想完成这道题我们就需要创建两个数组,arr保存要使用的字符串,arr1为空作为临时存储数据。然后将要旋转到前面的字串从arr1中取出来更改到arr的前面,再将要旋转到后面的字串提出来,更改到arr的后半部分。详情看代码注释

void Slue(char arr[], int a,const int length)
{
    //创建一个足够大的临时使用数组
    char arr1[100] = { 0 };
	int k = 0;
	int i = 0;
    //先将原数组的值保存在另一个足够大的空白数组
	for (k = 0; k < length; k++)
	{
		arr1[k] = *(arr + k);
	}
	//再将要被旋转到前面的数保存到arr的前面
	for (k = a; k < length; k++)
	{
		*(arr + i) = arr1[k];
		i++;
	}
	//将要被旋转到后面的数字保存到arr后面
	for (k = 0; k < a; k++)
	{
		*(arr + i) = arr1[k];
		i++;
	}
}

int main()
{
	char arr[] = "ABCD";
	int a = 0;	
	scanf("%d", &a);
	Slue(arr, a,strlen(arr));
	printf("%s", arr);
    system("pause");
}

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

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

int is_slue(char *arr1, char *arr2, int length)
{
	int i = 0;
	int count = 0;
	int ret = 0;

	for (i = 0; i < length; i++)
	{
		//遍历对比两,记录相同字符的个数
		//以此可以得出旋转了多少位
		while(*(arr1 + i) == *arr2)
		{
			count++;
			//数组名进行运算会隐式转换成指针,此时arr2一直往后走
			arr2++;
		}
	}
	//length-count即为左旋的一部分字符个数
	//count为参与旋转的另一部分字符个数
	//
	for (i = 0; i < length-count; i++)
	{
		//上一个for循环,将指针arr2已经走到后半部分
		if (*(arr1 + i) == *arr2)
			ret++;
		else
			return 0;
	}
	//判断
	if (length == count+ret)
		return 1;
	return 0;

}

int main()
{
	char arr1[] = "dabc";
	char arr2[] = "abcd";
	int ret = 0;
    //接受返回值
	ret = is_slue(arr1, arr2,strlen(arr1));
	//对返回值进行判断
	if (ret == 1)
		printf("两字符串互为左旋字符串\n");
	else
		printf("error\n");
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值