试题 算法训练 文章翻转
资源限制
内存限制: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;
}
方法二和方法一基本原理差不多,二种均可,但我觉得方法二更加简洁,方法一更能一气呵成写出,当然这并不唯一,各有各的看法。
欢迎大家留言评论,谢谢大家!