最近利用閒暇時間做了一下 pta basic level 裡的題,裡面現在一共有 95 道題,這些題大部分很基礎,對於刷倦了 leetcode 的小夥伴可以去裡面愉快的玩耍哦。
請聽題:
題目描述
給定乙個英語句子,各個單詞之間用空格分隔。要求你編寫程式,將句中所有單詞的順序顛倒輸出。
輸入示例
hello world here i come
輸出示例
come i here world hello
沒騙你吧,是不是很簡單。這道題我們確實可以很容易的解決,但你的思路是什麼呢?你設計的演算法很完美麼?
相信會有一部分小夥伴的思路是這樣滴:
首先string
來儲存輸入的句子,再split
分隔提取單詞,將單詞儲存在vector
中,最後倒序輸出。
vector
split
(string sentence)
intmain()
return0;
}
這樣沒毛病哈,我第一次就是這麼幹的。但對於這種簡單題,這樣做顯得太麻煩了,然後我在網上看到了這段**:
int
main()
return0;
}
當時真的驚豔到我了,上面**充分利用了cin
以空格分隔各個變數輸入的特點,直接提取到了各個單詞。
之後巧妙利用棧後進先出
的特點,將單詞依次壓入stack
,最後再依次彈出,就得到了逆序的單詞序列,這兩行**用的著實巧妙!
題目描述
據說天文學家愛丁頓為了炫耀自己的騎車功力,定義了乙個「愛丁頓數」 e
ee ,即滿足有 e
ee 天騎車超過 e
ee 英里的最大整數 eee。
現給定某人 n
nn 天的騎車距離,請你算出對應的愛丁頓數 e(≤
n)
e(≤n)
e(≤n)。
輸入第一行給出乙個正整數 n(≤
105)
n (≤10^5)
n(≤105
),即連續騎車的天數;第二行給出 n 個非負整數,代表每天的騎車距離。
在一行中輸出 n 天的愛丁頓數。
輸入示例
6 7 6 9 3 10 8 2 7 8
輸出示例
看到 n(≤
105)
n (≤10^5)
n(≤105
) 我以為不能暴力求解,但旺旺沒想到,暴力竟然也能過。首先我們來看一下暴力思路是咋樣的。
通過題目我們可以確定 e
ee 的取值範圍是0 ~ n
,也就是說我們要在0 ~ n
中搜尋乙個符合條件的盡可能大的數。
暴力思路就是這樣的:
for
(int i = n; i >=
0; i--
)}
這個時間複雜度是 on2
o_on
2,因為外層for
的遍歷需要 n
nn,判斷每個 i
ii 是否符合條件也需要 nnn。
要優化其實也很簡單。既然是要在0 ~ n
的空間中搜尋,而且0 ~ n
也是單調的,那正好符合二分的使用條件。我們就可以用二分來代替第一層for
迴圈,這樣時間複雜度就是 o(n
logn
)o_
o(nlog
n) 了。
二分優化後的**:
// 判斷k是否符合條件
bool
isok
(int k,
int a,
int n)
intmain()
cout << r;
return0;
}
像這種使用二分優化搜尋空間的題型 leetcode 上也有很多,比如 875. 愛吃香蕉的珂珂,1011. 在 d 天內送達包裹的能力,1231. 分享巧克力,對這塊不熟悉的小夥伴可以去做做。
題目描述
給定若干段繩子,你需要把它們串成一條繩。每次串連的時候,是把兩段繩子對折,再套接在一起。這樣得到的繩子又被當成是另一段繩子,可以再次對折去跟另一段繩子串連。每次串連後,原來兩段繩子的長度就會減半。
給定 n
nn 段繩子的長度,你需要找出它們能串成的繩子的最大長度。
輸入示例
10 15 12 3 4 13 1 15
輸出示例
經典演算法中有兩類演算法特別考驗解題思維,一是動態規劃,二是貪心思想。
這道題就是一道簡單的貪心題。根據題目的意思,我們需要找到一種串連方式,使得最終得到的繩子的長度最長,也就是使得 n
nn 段繩子損失的長度最小。
那麼如何盡可能減小繩子長度的損失呢?每次盡可能的選用短繩對折連線,從而避免長繩對折,採用這種方式進行連線繩子長度損失是最小的。
在程式中我們可以使用優先佇列priority_queue
讓隊首元素保持值最小,**如下:
int
main()
while
(q.size()
>1)
cout << q.
top();
return0;
}
對貪心不熟悉的小夥伴可以看看這篇文章:初識貪心思想。
這三道題不會很難吧,但要寫出令人眼前一亮的**不僅要有紮實的演算法基礎,還要能夠靈活的使用資料結構。所以在做題的時候要多思考,多總結!
今天是小年,祝大家小年快樂!
PTA Basic Level 1048 數字加密
本題要求實現一種數字加密方法。首先固定乙個加密用正整數 a,對任一正整數 b,將其每 1 位數字與 a 的對應位置上的數字進行以下運算 對奇數字,對應位的數字相加後對 13 取餘 這裡用 j 代表 10 q 代表 11 k 代表 12 對偶數字,用 b 的數字減去 a 的數字,若結果為負數,則再加 ...
PTA Basic Level 1028 人口普查
某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。這裡確保每個輸入的日期都是合法的,但不一定是合理的 假設已知鎮上沒有超過 200 歲的老人,而今天是 2014 年 9 月 6 日,所以超過 200 歲的生日和未出生的生日都是不合理的,應該被過濾掉。輸入格式 輸入...
PTA Basic Level 1027 列印沙漏
本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個 要求按下列格式列印 所謂 沙漏形狀 是指每行輸出奇數個符號 各行符號中心對齊 相鄰兩行符號數差2 符號數先從大到小順序遞減到1,再從小到大順序遞增 首尾符號數相等。給定任意n個符號,不一定能正好組成乙個沙漏。要求列印出的沙漏能用掉盡可能...