iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
Mobile Development

30天用 Swift 解 LeetCode 問題系列 第 18

Day 18 - 1323. Maximum 69 Number - 解法與複雜度分析 - LeetCode in Swift

  • 分享至 

  • xImage
  •  

hero

基本資訊

題意

給予一個只含有 9 和 6 的正數,在只可以替換一位數的限制下,回傳一個最大值。

範例

num = 9669

需要回傳

9969

1. 直覺解

轉換成陣列,替換掉第一個出現的 6 後回傳。

程式碼

class Solution {
    func maximum69Number (_ num: Int) -> Int {
        var string = Array(String(num))
        for index in 0..<string.count {
            if string[index] == "6" {
                string[index] = "9"
                break
            }
        }
        return Int(String(string))!
    }
}

執行結果

  • Runtime: 0 ms (Beats 100.00%)
  • Memory: 13.6 MB (Beats 78.95%)

複雜度分析

令 num 的位數為 n

Big O 說明
時間複雜度 O(n) 線性走訪
空間複雜度 O(n) 雖然轉型了好幾次,但是複雜度還是 n 的一次方

2. 數學解

  1. 檢查每一位數字,並算出差為多少
  2. 從最低位逐位算出差,並只保留最大差
  3. 走訪完後,把原始數字加上最大差即可

例如,以 966 的話,步驟如下

966
  ^

current diff: 3
diff: 3
966
 ^

current diff: 30
diff: max(3, 30) = 30
current diff: 0
diff: max(30, 0) = 30

結果值:

966 + 30 = 996

程式碼

class Solution {
    func maximum69Number (_ num: Int) -> Int {
        var number = num
        var diff = 0
        var digits = 1
        
        while number > 0 {
            diff = max((9 - number % 10) * digits, diff)
            number /= 10
            digits *= 10
        }
        
        return num + diff
    }
}

執行結果

  • Runtime: 0 ms (Beats 100.00%)
  • Memory: 13.4 MB (Beats 94.74%)

複雜度分析

令 num 的位數為 n

Big O 說明
時間複雜度 O(n) 線性走訪
空間複雜度 O(1) 只有多宣告了常數個的變數

比較

解法 時間複雜度 Runtime 空間複雜度 Memory
直覺解 O(n) 0 ms O(n) 13.6 MB
數學解 O(n) 0 ms O(1) 13.4 MB

兩者執行之後在 LeetCode 的差別看起來沒有很大,不過數學解有免去轉換型別消耗資源的優點。

結語

以上,就是今天的 LeetCode in Swift ,

如果有什麼問題和回饋歡迎留言一起討論,今天就到這裡,明天見!


上一篇
Day 17 - 169. Majority Element - 解法與複雜度分析 - LeetCode in Swift
下一篇
Day 19 - 1408. String Matching in an Array - 解法與複雜度分析 - LeetCode in Swift
系列文
30天用 Swift 解 LeetCode 問題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言