蓝桥杯 试题 算法训练 文章翻转

试题 算法训练 文章翻转

资源限制

内存限制:128.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

  输入一段英文,不含标点,将这一段英文以单词为单位倒序输出

输入格式

  一段英文(段内不含换行),以换行符结尾。

输出格式

  一段英文(段内不含换行),以换行符结尾。

样例输入

aab TTR bbc loV DDE Znr CCD

样例输出

CCD Znr DDE loV bbc TTR aab

数据规模和约定

  60%的数据保证单词长度不超过20,字符长度不超过10^3
  100%的数据保证单词长度不超过10^5,字符长度不超过10^6

对于本道题目,我们先看下例题

样例输入

aab TTR bbc loV DDE Znr CCD

接着我们进行翻转,本题相当于从右到左读出每一个单词(即左右2侧空格间夹住的字符串),这样我们就可以,通过数组存储这些单词,每存完一个便读出一个,最终形成翻转

 样例输出

CCD Znr DDE loV bbc TTR aab

具体代码如下:

#include <iostream>
#include <cstring>//字符数组函数头文件
using namespace std;
int main()
{
	char a[200005];//这里输入的字符可能很大,注意空格也会占用一个元素,所以我们使用字符字符数组,并定义地大一点
	int z=0;//这里用z来代表a数组的下标,方便我们进行后续操作
	while((a[z]=getchar())!='\n')//我们一个一个地输入字符,直到碰见换行符退出
	{
		z++;
	}
	a[z]='\0';//输入完一系列文章后,我们给字符串加上一个结束符
	int l=strlen(a);//再用l记录整串字符串的长度
	for(int i=l-1;i>=0;i--)//接着我们开始翻转文章了
	{
		char b[100005];//每个单词最多有100000个字符,这里我们定义数组范围时要大一点
		int j=0,len=i;
		while(a[len]!=' ' && len!=-1)//我们从最后一个字符开始,从后往前记录字符到字符数组b中,直到碰到空格,或已无可读内容(即读到了从左往右的第一个字符之后)
		{
			b[j++]=a[len--];//每记录完一个字符让b的下标加一,len的下标减一
		}
		for(int h=j-1;h>=0;h--)//接着倒序输出b中的字符(因为前面倒着读,此时我们倒着读出,即为正着读,相当于负负得正)
		{
			cout<<b[h];
		}
		cout<<" ";//读完这串字符后,输出空格
		i=len;//此时len的位置为空格字符右边的第一个字符,这时让i=len,又通过for循环的i--,可以成功让i的值到达空格字符左边的第一个单词
	}
	return 0;
}

对于本题来说读单词不一定需要存储到数组中再读出,于是有下面这一种方法

具体代码如下:

#include <iostream>
using namespace std;
int main()
{
	char a[200005];//这里输入的字符可能很大,注意空格也会占用一个元素,所以我们使用字符字符数组,并定义地大一点
	int l=0;//这里用l来代表a数组的下标,方便我们进行后续操作,记录a的长度
	while((a[l]=getchar())!='\n')//我们一个一个地输入字符,直到碰见换行符退出
	{
		l++;
	}
	a[l]='\0';//输入完一系列文章后,我们给字符串加上一个结束符
	for(int i=l-1;i>=-1;i--)//接着我们开始翻转文章了,这里为了方便所以让i大于等于-1,后面读数时从i+1开始读,只有当i=-1时才能读到第一个字符串
	{
		if(a[i]==' ' || i==-1)//我们从最后一个字符开始,从后往前读,直到碰到空格,或已无可读内容(即读到了从左往右的第一个字符之后)
		{
			for(int j=i+1;j<l;j++)//接着从i+1的位置从左向右读,因为a[i]此时的位置位于数组范围外,或存入的是空格字符
			{
				cout<<a[j];
			}
			cout<<' ';//读完这串字符后,输出空格
			l=i;//读完之后相当于直接从a数组中扣掉倒数第一个单词及一个空格字符。所以让l的长度等于i
		}
	}
	return 0;
}

方法二和方法一基本原理差不多,二种均可,但我觉得方法二更加简洁,方法一更能一气呵成写出,当然这并不唯一,各有各的看法。

欢迎大家留言评论,谢谢大家!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值