iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0

「難怪只贏過十幾趴的人,不就是倒數了嗎⋯⋯」學妹看著數據挑了挑眉毛。「時間會浪費掉,應該是因為排序了兩次?」

「沒錯!所以我這邊有個解法只要一個迴圈就結束啦!」我挺胸驕傲道。「按順序塞滿數字,滿員之後如果新人表現更好就把舊人踢掉。」

「那要怎麼決定踢掉哪個舊人?」學妹問。

「當然是最早進來的那個舊人啊,越早進來的就離目標更遠,充分利用題目的優勢吧!」我眨眨眼。「然後在已經不可能會有更好的新人的時候結束迴圈。」

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出問題了!」

截圖 2022-10-02 下午12 04 07

天哪,我從來沒看過這個訊息!

我試著保持鎮定:「重新整理看看。」

結果出現更慘的畫面,畫面上掛著正在維修的文字。

截圖 2022-10-02 下午12 07 19

幸好重新整理前我讓學妹先把程式碼複製到剪貼簿,現在就等網站恢復正常。

會、會恢復正常的吧?

學妹和我都相當不安,一點都不想知道如果沒有解題,會發生什麼事。

明明只剩一天了啊!


上一篇
Day25: 題目easy和medium的差別
下一篇
Day27: [Normal End] Depth-First-Search注意繞圈子
系列文
不解題就不能離開的房間31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言