初始化 ans 為 numBottles,表示把一開始的礦泉水全部喝完,使其成為空瓶。接下來,當 numBottles 大於等於 numExchange 時:
計算可以兌換的新瓶子數量 q 和剩餘的空瓶數量 r。
將 q 加到 ans 中,表示多喝了 q 瓶水。
更新 numBottles 為 q+r,繼續下一輪兌換。
持續上述過程直到無法再進行兌換操作為止。最後返回 ans。
複雜度分析
時間複雜度: O(logen),其中 n 是 numBottles、e 是 numExchange。
每次迭代時,瓶子的數量大致上會除以 numExchange,因此迭代次數是對數級別的。
空間複雜度: O(1)。
1 2 3 4 5 6 7 8
classSolution: defnumWaterBottles(self, numBottles: int, numExchange: int) -> int: ans = numBottles while numBottles >= numExchange: q, r = divmod(numBottles, numExchange) numBottles = q + r ans += q return ans
1 2 3 4 5 6 7 8 9 10 11
classSolution { public: intnumWaterBottles(int numBottles, int numExchange){ int ans = numBottles; while (numBottles >= numExchange) { ans += numBottles / numExchange; numBottles = numBottles / numExchange + numBottles % numExchange; } return ans; } };