雙周賽110。有點小囉嗦,還差點忘記怎麼四捨五入。

題目

起初你擁有100塊錢。

輸入整數purchaseAmount,代表你接下來的消費額。

你會在商店買東西,然後消費額會四捨五入到最接近的十的倍數。
也就是說,你會支付一個非負的額度roundedAmount,且roundedAmount是十的倍數,並且abs(roundedAmount - purchaseAmount)被最小化

如果有多個最接近的十的倍數,則選擇較大者。

求支付完消費額度後會剩下多少錢。

注意:0也視作10的倍數。

解法

一開始本來想說把amount除10後用內建函數round來處理,但總覺得哪裡怪怪的。後來改成暴力枚舉,成功躲過這個陷阱。
沒錯,round(0.5)因為浮點數精度問題,結果竟然是0!

還是乖乖手動判斷餘數吧,如果餘數大於等於5就進位,否則捨去。
從初始的100塊中扣掉就是答案。

時間複雜度O(1)。
空間複雜度O(1)。

class Solution:
    def accountBalanceAfterPurchase(self, purchaseAmount: int) -> int:
        d,r=divmod(purchaseAmount,10)
        if r>=5:
            d+=1
            
        return 100-d*10

來自votrubac大佬的一行版本,真的有夠簡潔。

class Solution:
    def accountBalanceAfterPurchase(self, purchaseAmount: int) -> int:
        return 100-(purchaseAmount+5)//10*10