166. Fraction to Recurring Decimal | LeetCode | Swift

vc7-avatar-img
發佈於LeetCode
更新 發佈閱讀 5 分鐘

每日一題

日期

  • 2025/9/24
raw-image
raw-image

程式碼與行內註解解釋

程式碼好看版

解法與程式碼

這題需要做的事就是進行長除法。再加上利用 HashMap 協助識別重複的小數位。

class Solution {
func fractionToDecimal(_ numerator: Int, _ denominator: Int) -> String {
guard numerator != 0 else { return "0" }

// 暫存結果
var result = [String]()

// 分子與分母一正一負時,暫存負號
if numerator * denominator < 0 {
result.append("-")
}

// 取絕對值。分子會持續改變,分母固定,因此 var 和 let 如此設定
var numerator = abs(numerator)
let denominator = abs(denominator)

// 先算整數的部分。計算完之後更新分子,新的分子為零時,代表計算結束回傳結果。
result.append(String(numerator/denominator))
numerator = numerator % denominator

guard numerator != 0 else { return result.joined() }

// 在計算小數位
result.append(".")

// 為了要知道重複的小數位,建立一個 dictionary (HashMap) 來紀錄重複開始的位置。
var map = [Int: Int]()
map[numerator] = result.count

// 正向 routine - 執行到分子為零就停止
while numerator != 0 {
// 小數點以下每一次計算分子(被除數)都要補 0
numerator *= 10

// 進行除法運算、更新分子
result.append(String(numerator/denominator))
numerator = numerator % denominator

if let value = map[numerator] {
// 發現有重複的數字就停止
let index = value
result.insert("(", at: index)
result.append(")")
break
} else {
map[numerator] = result.count
}
}

return result.joined()
}
}
留言
avatar-img
留言分享你的想法!
avatar-img
萱寫寫
2會員
16內容數
讀書心得、活動參加心得
萱寫寫的其他內容
2025/09/23
LeetCode 每日一題: 2025/09/23
2025/09/23
LeetCode 每日一題: 2025/09/23
2025/09/22
2025/09/22
2025/09/19
LeetCode 每日一題: 2025/09/19
2025/09/19
LeetCode 每日一題: 2025/09/19
看更多