字符串逆序+单词逆序

字符串逆序+单词逆序

一.字符串逆序

问题描述:

输入一个字符串arr,将其内容颠倒过来,并输出。

数据范围0<len(arr)<10000

输入描述:

输入一个字符串,可以有空格

输出描述:

输出逆序之后的字符串

输入: abcdef
输出:fedcba
输入: I love BeiJing.
输出:.gniJieB evol I

方法一
利用循环的方式,将字符串进行逆序

#include<stdio.h>
#include<string.h>
void reverse(char *p,int len)
{
    
    
	char* q = p + len - 1;
	while (p < q)   //循环终止条件
	{
    
    
		*p ^= *q;      //利用位操作符,不创建变量
		*q ^= *p;
		*p ^= *q;
		p++;
		q--;
	}

	//while (p < q)
	//{
    
    
	//	char tmp = *p;//创建变量进行逆序
	//	*p = *q;
	//	*q = tmp;
	//	p++;
	//	q--;
	//}
}
int main()

{
    
    
	char arr[20] = "0";
	scanf("%[^\n]", arr);
	int len = strlen(arr);
	reverse(arr,len);
	printf("%s", arr);
	return 0;
}

方法二

利用递归的方式,将字符串逆序

#include<stdio.h>
#include<string.h>
void reverse(char *p,int len)
{
    
    
	*p = *p ^ *(p + len - 1);
	*(p + len - 1) = *p ^ *(p + len - 1);
	*p= *p ^ *(p + len - 1);
	char ch=*(p + len - 1);
	*(p + len - 1) = '\0';
	if (strlen(p+1) > 1)   //如果之间的长度大于1的话,再次进行逆序
		reverse(p + 1, strlen(p+1));
	*(p + len - 1) = ch;
}
int main()

{
    
    
	char arr[20] = "0";
	scanf("%[^\n]", arr);//     ^\n是直到遇到\n才停止,即为遇到回车之前
	int len = strlen(arr);
	reverse(arr,len);
	printf("%s", arr);
	return 0;
}

注意的是,要将每次逆序之后的较后一个元素先赋值为’\0‘,再然后将其原来的值赋值回去,避免递归出错在这里插入图片描述

二.单词逆序

问题描述:

输入一个字符串arr,将其单词颠倒过来,并输出,要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只
允许出现一个空格间隔符

数据范围0<len(arr)<10000

输入描述:

输入一个字符串,可以有空格

输出描述:

输出逆序之后的单词

输入:abc def ghi
输出:ghi def abc

输入:I love Beijing.
输出:Beijing. love I

方法一
先上代码,接下来分析

#include<stdio.h>
#include<assert.h>
#include<string.h>
void reverse( char* p,  char* q)
{
    
    
	assert(p && q);         //判断是否为NULL
	while (p != q)//   while(p<q)
	{
    
    
		char tmp = *p;
		*p = *q;
		*q = tmp;
		p++;
		q--;
	}
}
int main()
{
    
    
	char arr[10000] = "I love Beijing.";
	int len = strlen(arr);
	reverse(arr, arr+len-1);   //先将字符串进行整体逆序
	char* cur = arr;
	while (*cur)
	{
    
    
		char* start = cur;
		while (*cur != ' '&&*cur)
			cur++;
		reverse(start, cur - 1);   //逆序单词

		//if(*cur==' ')
			cur++;

	}
	printf("%s\n", arr);
	return 0;
}

我们要想将单词逆序的话,我们可以先将字符串先进行整体逆序,然后我们可以发现,只要再次将每个空格之前的单词进行逆序操作就行

在这里插入图片描述在这里插入图片描述

方法二
这个方法呢,和方法一类似,但是确实另外一种想法,从后面往前直到遇到空格
接下来看看代码

#include<stdio.h>
#include<string.h>
void reverse(char* p,int len)
{
    
    
	//I love Beijing.
	char* q = p + len - 1;
	while (*q)//进行外部循环
	{
    
    
		while (*q != '\0' && *q != ' ')//计数作用
			q--;
		q++;
		char* ch = q;
		while (*ch && *ch != ' ')//打印
		{
    
    
		    if (*ch >= '0' && *ch <= '9' || *ch >= 'a' && *ch <= 'z' || *ch >= 'A' && *ch <= 'Z'||*ch=='.')    //避免出现错误

			printf("%c", *ch);
			ch++;
		}
		printf(" ");
		q -= 2;  //将q指向空格之前的地址
	}
}
int main()
{
    
    
	char arr[100] = "0";
	scanf("%[^\n]", arr);
	int len = strlen(arr);
	reverse(arr, len);
	return 0;
}

在这里插入图片描述

三、感谢以及交流

如果这一份字符串逆序+单词逆序的博客对你有所帮助的话,请给博主一个免费点赞,以示鼓励!!!在这里插入图片描述

欢迎各位点赞,评论,收藏,一键三连哦,谢谢捧场!!!!
如果对博客有什么疑问或者不同的见解以及博客当中有什么错误的话,欢迎评论区留言!!!!!!!!!!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/2201_76062618/article/details/129152289