字符串的逆序

一、字符串的左逆序

有这样一个字符串,“abcdefg",现在需要这个字符串往左边逆序一个字母,得到”bcdefga"。请用代码展示。

解题思路:

当我们左旋转移动N个字符时,第N+1个字符移到第一个字符的位置,后面的字符依次往上移,移动的字符依次落在末尾字符的后面,思路可见下图

以上就是我们整个代码的思路。

1.分装函数写法:

(1)代码演示:

int left_move(char *arr, int k)
{
	int len = strlen(arr);
	for (int j = 0; j < k; j++)
	{
		char tmp = *arr;
		for (int i = 0; i < len - 1; i++)
		{
			*(arr + i) = *(arr + i + 1);
		}
		*(arr + len - 1) = tmp;
	}
	return arr;
}
int main()
{
	char arr[20] = "abcdefg";
	int k = 0;
	scanf("%d", &k);
	left_move(arr, k);
	printf("%s\n", arr);
	return 0;
}

left_move函数中创造一个tmp存放字符串中的第一个字符,使第一个字符的位置空出来用于后面字符的挪位。最后把字符串空出来的位置放入我们移动的字符。

2.三步逆序 :

以上是我们比较能想到的解题方法,这里也有另一个方法,相对于上面的方法,相对简单一些,但不易想到。

(1)三步逆序的思路:

我们先把我们所需要逆序的几个字符串看为一个整体,先把它们逆序,再把剩下的字符看为一个整体逆序,最后把它们逆序的结果看为一个整体,最后整体逆序就是我们逆序字符的最终的结果了,不明白的话,我们还是看图解释吧。

 

(2)代码演示

首先我们还是要先写一个main函数。在main函数中,我们还是需要使用scanf函数来录入我们需要逆序几个字符,传入我们新创建的left_move函数中

int main()
{
	char arr[20] = "abcdefg";
	int k = 0;//逆序几个字符
	scanf("%d", &k);
	left_move(arr, k);
	printf("%s\n", arr);
	return 0;
}

在left_move函数中我们需要逆序,因此我们在此函数中写一个逆序函数

void left_move(char* arr, int k)
{
	int len = strlen(arr);
	reverse(arr, arr+k-1);
	reverse(arr+k, arr + len - 1);
	reverse(arr, arr+len-1);
}

在这个逆序函数中,我们需要实现字符串的逆序,还是在逆序函数中创建一个新的变量放挪动的字符,再把后面的字符移动到挪动的字符原本的位置,最后把挪动的字符放入后面字符的位置中,关于这个想法,我们也可以画图解释 

有了这个思路,我们就可以写出我们的逆序函数了。 

void reverse(char* left, char* right)
{
	while (left <= right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		*left++;
		*right--;
	}
}

分板块写完之后,我们可以凑在一起看看这个代码的实现。 

整体代码:

void reverse(char* left, char* right)
{
	while (left <= right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		*left++;
		*right--;
	}
}

void left_move(char* arr, int k)
{
	int len = strlen(arr);
	reverse(arr, arr+k-1);
	reverse(arr+k, arr + len - 1);
	reverse(arr, arr+len-1);
}
int main()
{
	char arr[20] = "abcdefg";
	int k = 0;//逆序几个字符
	scanf("%d", &k);
	left_move(arr, k);
	printf("%s\n", arr);
	return 0;
}

二、判断一个字符串是不是由另一个字符串旋转得来 

这道题其实与我们上面所写的题到差不差,因为主要思路其实都是一样的,这道题只是比上一道题多了一个判断罢了。

解题思路:

如果一个字符串arr2是由另一个字符串arr1旋转的来,那么把让字符串arr1自己追加自己,这里可以使用我们前面讲的字符函数,我们可以使用strncat(为啥不使用strcat可以看看之前我写的字符串函数那篇文章,那里详细解答了strcat函数的功能及使用)最后我们使用strstr函数去查找我们的arr2是否能在我们追加后的arr1中找到,如果不是则返回NULL

(1)利用字符函数(strstr,strncat)实现:


int is_left_move(const char* arr1, const char* arr2)
{
	int len1 = strlen(arr1);
	int len2 = strlen(arr2);
	if (len1 != len2)
	{
		return 0;
	}
	strncat(arr1, arr1, len1);
	if (strstr(arr1, arr2) == NULL)//返回空指针意味着不是旋转的来的
	{
		return 0;
	}
	else
	{
		return 1;
	}
	
}

int main()
{
	char arr1[30] = "abcdef";
	char arr2[] = "cdefab";
	int len = strlen(arr1);
	int m=is_left_move(arr1, arr2);
	if (m==1)
	{
		printf("YES\n");
	}
	else
		printf("NO\n");
	return 0;
}

(2)用函数strcmp字符函数判断 

当然了,我们如果对字符函数不熟悉,想自己用代码实现这个功能,也是可以滴。 

 我们可以借鉴前面的那个字符串的逆序,每逆序一个字符我们就判断一次逆序后的字符串是不是与arr2相等,用我们的strcmp函数判断我们的arr1与arr2是否相等,若相等则返回0。以上就是我们大多数可以想到的一个解题思路,还是看看我们的代码吧。

int is_left_move(char *arr1, char*arr2)
{
	int len = strlen(arr1);
	int ret = 0;
	for (int j = 0; j < len; j++)
	{
		char tmp = arr1;
		for (int i = 0; i < len - 1; i++)
		{
			*(arr1 + i) = *(arr1 + i + 1);
		}
		*(arr1 + len - 1) = tmp;
		if (strcmp(arr1,arr2)==0)
		{
			ret = 1;
		}
	}
	return ret;
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "cdefab";
	int len = strlen(arr1);
	int m=is_left_move(arr1, arr2);
	if (m==0)
	{
		printf("YES\n");
	}
	else
		printf("NO\n");
	return 0;
}

好咯,今天小陈的分享就到这里咯,希望对各位有帮助,还是老样子,欢迎大家在评论区留言纠错,蟹蟹! 

 

 

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dongliner~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值