1. 程式人生 > 其它 >試題 演算法訓練 單詞翻轉+文章翻轉

試題 演算法訓練 單詞翻轉+文章翻轉

技術標籤:藍橋杯c++

單詞翻轉:

資源限制
時間限制: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;
}

評測結果:

在這裡插入圖片描述

補充:

文章翻轉的時間效率相對較低,有時間會去改變下方法,找出相對較好的解法,敬請期待。