題目
https://leetcode.com/problems/water-bottles/description/?envType=daily-question&envId=2025-10-01
日期
2025/10/1

直覺解
每一次的 while 迴圈,進行:
- 從當前的被除數,算出商
- 商加上餘數作為新的被除數
- 把結果加上當前的商
直到當前的被除數小於除數為止。
就是一五一十的把題意寫出來。
class Solution {
func numWaterBottles(_ numBottles: Int, _ numExchange: Int) -> Int {
var current = numBottles
var result = current
while current >= numExchange {
let new = current / numExchange
current = new + current % numExchange
result += new
}
return result
}
}
優化解
因為每一次兌換後,會拿回一個瓶子,因此每次空瓶的兌換成本是 numExchange - 1
接下來只要算透過兌換成本能換幾次。但是因為在 edge case 裡,例如餘數剛好等於兌換成本的時候,就會被多換一次。以第二個範例為例:
Input: numBottles = 15, numExchange = 4
15 / (4 - 1) 為 5 。但是其實應該為 4 ,因為最後一組的三個空瓶其實是沒有辦法兌換的。 -1 就是為了這一類的情形做的調整。
程式碼
因此這邊的計算方式就變成這樣:
原本的瓶數 + 能兌換到的瓶數
class Solution {
func numWaterBottles(_ numBottles: Int, _ numExchange: Int) -> Int {
return numBottles + (numBottles - 1) / (numExchange - 1)
}
}




















