「難怪只贏過十幾趴的人,不就是倒數了嗎⋯⋯」學妹看著數據挑了挑眉毛。「時間會浪費掉,應該是因為排序了兩次?」
「沒錯!所以我這邊有個解法只要一個迴圈就結束啦!」我挺胸驕傲道。「按順序塞滿數字,滿員之後如果新人表現更好就把舊人踢掉。」
「那要怎麼決定踢掉哪個舊人?」學妹問。
「當然是最早進來的那個舊人啊,越早進來的就離目標更遠,充分利用題目的優勢吧!」我眨眨眼。「然後在已經不可能會有更好的新人的時候結束迴圈。」
class Solution {
fun findClosestElements(arr: IntArray, k: Int, x: Int): List<Int> {
val result = LinkedList<Int>()
myloop@ for (it in arr) {
when {
result.size < k -> result.add(it)
it - x <= 0 -> {
result.removeFirst()
result.add(it)
}
Math.abs(result.first() - x) > it - x -> {
result.removeFirst()
result.add(it)
}
else -> break@myloop
}
}
return result
}
}
因為是在when
裡面結束迴圈,所以要另外命名迴圈,才能讓程式明白是要結束誰。
學妹歪頭看著程式碼,面帶疑色:「為什麼要多一個it - x <= 0
?直接Math.abs(result.first() - x) > Math.abs(it - x)
這樣不好嗎?」
「哦,因為可能會出現重複的數字啊。重複的數字就代表一樣的距離,而題目希望當距離一樣的時候,留下舊人。」我拿了一個重複的例子給學妹模擬。
[1,1,1,10,10,10]
1
9
這個例子會在學妹改過的程式碼裡迴圈跑第二次的時候就結束迴圈,回傳答案1,但正確答案是10。
「啊。原來要改加入成員的條件,就要連結束迴圈的條件也一併改。」學妹恍然大悟。
「對呀,已經去業界的學姊說過一句話:『Bug並不可怕,可怕的是修改一個Bug之後可能會出現一群的Bug』。妳改善程式邏輯前,如果像這次一樣沒有先確認所有邏輯就改下去,可是會出大問題的!」
學妹大驚失色。「學姊!出問題了!」
「嗯?不可能,我考慮過題目的各種條件了,我的解法絕對沒問題。」
「不是解法,是Leetcode出問題了!」
天哪,我從來沒看過這個訊息!
我試著保持鎮定:「重新整理看看。」
結果出現更慘的畫面,畫面上掛著正在維修的文字。
幸好重新整理前我讓學妹先把程式碼複製到剪貼簿,現在就等網站恢復正常。
會、會恢復正常的吧?
學妹和我都相當不安,一點都不想知道如果沒有解題,會發生什麼事。
明明只剩一天了啊!