取整购买后的账户余额

标签: 数学

难度: Easy

一开始,你的银行账户里有 100 块钱。

给你一个整数purchaseAmount ,它表示你在一次购买中愿意支出的金额。

在一个商店里,你进行一次购买,实际支出的金额会向 最近 的 10 的 倍数 取整。换句话说,你实际会支付一个 非负 金额 roundedAmount ,满足 roundedAmount 是 10 的倍数且 abs(roundedAmount - purchaseAmount) 的值 最小 。

如果存在多于一个最接近的 10 的倍数,较大的倍数 是你的实际支出金额。

请你返回一个整数,表示你在愿意支出金额为 purchaseAmount 块钱的前提下,购买之后剩下的余额。

注意: 0 也是 10 的倍数。

示例 1:

输入:purchaseAmount = 9
输出:90
解释:这个例子中,最接近 9 的 10 的倍数是 10 。所以你的账户余额为 100 - 10 = 90 。

示例 2:

输入:purchaseAmount = 15
输出:80
解释:这个例子中,有 2 个最接近 15 的 10 的倍数:10 和 20,较大的数 20 是你的实际开销。
所以你的账户余额为 100 - 20 = 80 。

提示:

  • 0 <= purchaseAmount <= 100

Submission

运行时间: 24 ms

内存: 16.5 MB

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

Explain

题解的核心思路是计算购买金额purchaseAmount向最近的10的倍数取整的结果roundedAmount,并从初始余额100中减去这个值来得到购买后的余额。首先,判断购买金额对10取余的结果(purchaseAmount % 10),这个余数用于决定金额向上舍入还是向下舍入。如果余数大于等于5,则意味着应当向上取整到下一个10的倍数;如果余数小于5,则向下取整到最近的较小的10的倍数。

时间复杂度: O(1)

空间复杂度: O(1)

class Solution:
    def accountBalanceAfterPurchase(self, purchaseAmount: int) -> int:
        # 如果purchaseAmount的最后一位数字大于等于5,应当向上取整
        if purchaseAmount % 10 >= 5:
            # 向上取整到下一个10的倍数,并从100中减去得到最终余额
            return 100 - ((purchaseAmount // 10) + 1) * 10
        else:
            # 否则向下取整到当前或更低的10的倍数,并从100中减去得到最终余额
            return 100 - (purchaseAmount // 10) * 10

Explore

根据常用的四舍五入规则,当一个数字在被除数的中点时,通常会向上舍入到更大的数。这样做可以减少总体的舍入误差,并且在许多应用中,向上取整被视为更加正面或保守的估计。在此算法中,采用向上取整可以确保在边界条件下,处理方式与常见的四舍五入方法一致。

原始算法没有直接考虑负数输入的情况。为了处理负数输入,我们可以在取整操作之前,首先对`purchaseAmount`取绝对值,然后再应用取整逻辑。处理完毕后,再将结果转换回相应的负数,这样可以确保算法在负数输入下也能正确运行。修改后的代码可以是: python class Solution: def accountBalanceAfterPurchase(self, purchaseAmount: int) -> int: if purchaseAmount < 0: purchaseAmount = -((-purchaseAmount + 5) // 10 * 10) else: if purchaseAmount % 10 >= 5: purchaseAmount = ((purchaseAmount // 10) + 1) * 10 else: purchaseAmount = (purchaseAmount // 10) * 10 return 100 - purchaseAmount

使用`(purchaseAmount // 10) + 1`在`purchaseAmount`为19时会正确工作,因为这将计算为`(19 // 10) + 1 = 2`,然后乘以10得到20,这是向上取整到最近的10的倍数的正确结果。这种方法在所有情况下都能正确地将金额向上舍入到下一个10的倍数。

题解中的逻辑是基于常规的四舍五入规则,即在正好处于两个10的倍数之间时(例如50%的情况),选择较大的倍数。这与许多实际应用中的舍入逻辑一致,例如在财务计算中常用的方法。因此,这种逻辑在大多数情况下都能正确反映题目的指示,除非题目明确指定了使用不同的舍入规则。