每日一題之 考試

題目1

給定一個無序的數組,數組內的數字可重複,求要使得這個數組內元素按升序排列元素交換的最少次數是多少?

輸入:

[2, 1, 2, 1, 2, 1]

輸出:

2

題目2

給一個由數字,"(", “)” 以及 “,” 所組成的字符串,如 “9(18(12,12),(11))”,其中每一對“()”代表一個級別,可以嵌套,級別從0開始,9沒有在"()“內,所以9的級別爲0,18在第一個”()"內,級別爲1,12,12在第二個“()”內,所以級別爲2,11也在第二個括號內,級別爲2。輸出所有數字*級別的和

輸入:

“9(18(12,12),(11))”

輸出:

88

題目3

給定一個n*m的矩陣,其中矩陣中有k個噪音點,每個噪音點都具有一個分貝值。而且噪音點可以從8個方向向周圍擴散,並且當噪音的分貝值爲1時,停止擴展散。擴散時,小的噪音值會被大的噪音值覆蓋,並且總是保留最大的噪音值。求最後擴散完成時,整個矩陣中所有噪音值的總和。

輸入:

第一行爲 n,m, k
接下來的 k 行,每行包括三個數,x,y, value
其中 x,y表示噪音點的座標(從0開始),value表示噪音的分貝值

5 6 2
3 4 3
1 1 4

輸出:

63

題解:

第一題:
  • 首先對copy一份數組,然後對其排序,得到升序排序的結果。將排序好的數組和原數組的每個元素進行比較,如果不相同,那表明該元素在原數組中必然會被交換的,用 cnt 記錄下來。所以最少交換次數即爲 cnt/2
第二題:
  • 字符串處理,括號匹配的變種,用棧來記錄“(”的個數,棧的大小即爲當前數字的級別,遇到“)”則出棧,每次遇到數字即可計算 數字*級別就行
第三題
  • 典型的BFS題目,首先將噪音點看成一個三元組(x, y, val)入隊列,隨後從隊列中取出一個元素,從8個方向擴散,擴散時需要判斷當前點的分貝值與擴散後的分貝值的大小,如果當前點的分貝值比擴散後的要大,則continue,否則將該點入隊列繼續擴散。需要注意的時,輸入的噪音點可以重複,維護分貝值最大即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章