試題 演算法訓練 單詞翻轉+文章翻轉
阿新 • • 發佈:2021-01-30
單詞翻轉:
資源限制
時間限制: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;
}
評測結果:
補充:
文章翻轉的時間效率相對較低,有時間會去改變下方法,找出相對較好的解法,敬請期待。