題目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,否則將該點入隊列繼續擴散。需要注意的時,輸入的噪音點可以重複,維護分貝值最大即可。