试题 算法训练 单词翻转+文章翻转

单词翻转:

资源限制
时间限制:1.0s 内存限制:256.0MB


输入格式
  输入包括一个英语句子。
输出格式
  按单词的顺序把单词倒序输出


样例输入
I love you
样例输出
you love I


数据规模和约定
  简单的字符串操作


思路历程:

这道题目主要就是输入的时候有空格,要用到getline()函数,其作用是接收一行数据,包括空格。然后面临的就是倒序输出的问题,开始我用的是multiset这个容器做的,写完之后发现他会对string类型数据根据字典序自动排序,不会按照接收顺序存放,然后就没有办法,想到用队列来做。

解题方法:

  • 声明队列(queue)

不清楚队列的可见:https://blog.csdn.net/weixin_49243150/article/details/113338393

  • 获取用户输入的数据,以一个一个单词的顺序存入队列
  • 利用循环和队列的入队出队,实现倒序输出

源程序:

#include<iostream>
#include<queue>
#include<string>
using namespace std;
int main()
{
     
   queue<string>m;//队列
   string s;//用来获取用户输入的数据
   string stu = "";//用来获取一个一个的单词(不包括空格)
   while (getline(cin, s))//getline()函数
   {
     
   	for (int i = 0; i < s.size(); i++)
   	{
     
   		if (s[i] != ' ')
   		{
     
   			stu = stu + s[i];
   		}
   		if (s[i] == ' ' || i == s.size() - 1)
   		{
     
   			m.push(stu);//将空格前面的单词存入队列
   			stu = "";//初始化为空
   		}
   	}
   	break;//执行玩一遍后退出,因为只输入了一行数据
   }
   while (m.size())
   {
     
   	for (int i = 0; i < m.size() - 1; i++)
   	{
     
   		m.push(m.front());//将头元素入队
   		m.pop();//删除头元素
   	}
   	cout << m.front() << " ";
   	m.pop();//将输出完毕的元素删除
   }
}

评测结果:在这里插入图片描述

文章翻转:

资源限制
时间限制:1.0s 内存限制:128.0MB


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


输入格式
  一段英文(段内不含换行),以换行符结尾。
输出格式
  一段英文(段内不含换行),以换行符结尾。


样例输入
aab TTR bbc loV DDE Znr CCD
样例输出
CCD Znr DDE loV bbc TTR aab


数据规模和约定
  60%的数据保证单词长度不超过20,字符长度不超过10^3
  100%的数据保证单词长度不超过105,字符长度不超过106


说明:

本题文章翻转和单词翻转是一个思路,就是对于文章翻转来说,单词的数目更多,就代表着队列入队出队的次数会成倍增长,不过我拿上单词翻转对应的代码试了一下,时间效率是421ms,变大了很多,但是没有超出题目的界限,我也就没有再去优化程序。

源程序:

#include<iostream>
#include<queue>
#include<string>
using namespace std;
int main()
{
     
	queue<string>m;//队列
	string s;//用来获取用户输入的数据
	string stu = "";//用来获取一个一个的单词(不包括空格)
	while (getline(cin, s))//getline()函数
	{
     
		for (int i = 0; i < s.size(); i++)
		{
     
			if (s[i] != ' ')
			{
     
				stu = stu + s[i];
			}
			if (s[i] == ' ' || i == s.size() - 1)
			{
     
				m.push(stu);//将空格前面的单词存入队列
				stu = "";//初始化为空
			}
		}
		break;//执行玩一遍后退出,因为只输入了一行数据
	}
	while (m.size())
	{
     
		for (int i = 0; i < m.size() - 1; i++)
		{
     
			m.push(m.front());//将头元素入队
			m.pop();//删除头元素
		}
		cout << m.front() << " ";
		m.pop();//将输出完毕的元素删除
	}
	cout << endl;
}

评测结果:

在这里插入图片描述

补充:

文章翻转的时间效率相对较低,有时间会去改变下方法,找出相对较好的解法,敬请期待。

你可能感兴趣的:(蓝桥杯,c++)