Easy

题目描述

最初,你的银行账户余额为 100 美元。

给你一个整数 purchaseAmount,表示你要购买的物品价格(以美元为单位)。

在进行购买时,首先将 purchaseAmount 四舍五入到最接近的 10 的倍数。我们将此值称为 roundedAmount。然后,从你的银行账户中扣除 roundedAmount 美元。

返回一个整数,表示购买后你的最终银行账户余额。

注意:

  • 在此问题中,0 被认为是 10 的倍数。
  • 四舍五入时,5 向上舍入(5 舍入为 10,15 舍入为 20,25 舍入为 30,依此类推)。

示例 1:

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

示例 2:

输入:purchaseAmount = 15
输出:80
解释:最接近 15 的 10 的倍数是 20。所以你的账户余额变为 100 - 20 = 80。

示例 3:

输入:purchaseAmount = 10
输出:90
解释:10 本身就是 10 的倍数。所以你的账户余额变为 100 - 10 = 90。

约束条件:

  • 0 <= purchaseAmount <= 100

解题思路

解题思路

这道题的核心是理解四舍五入到最接近的 10 的倍数的规则。

方法一:数学公式法(推荐)

观察四舍五入规律:

  • 个位数字 0-4:向下舍入(如 23 → 20)
  • 个位数字 5-9:向上舍入(如 25 → 30,29 → 30)

可以使用数学公式:roundedAmount = ((purchaseAmount + 5) / 10) * 10

这个公式的原理是:

  • 加 5 是为了处理四舍五入(当个位>=5时,加5后会进位)
  • 除以 10 再乘以 10 相当于去掉个位数

方法二:暴力枚举法

由于约束条件 purchaseAmount <= 100,我们可以枚举所有 10 的倍数(0, 10, 20, …, 100),找到与 purchaseAmount 距离最小的那个。当距离相等时(如 15 距离 10 和 20 都是 5),选择较大的值。

两种方法时间复杂度不同,数学公式法更优。

代码实现

class Solution {
public:
    int accountBalanceAfterPurchase(int purchaseAmount) {
        int roundedAmount = ((purchaseAmount + 5) / 10) * 10;
        return 100 - roundedAmount;
    }
};
class Solution:
    def accountBalanceAfterPurchase(self, purchaseAmount: int) -> int:
        rounded_amount = ((purchaseAmount + 5) // 10) * 10
        return 100 - rounded_amount
public class Solution {
    public int AccountBalanceAfterPurchase(int purchaseAmount) {
        int roundedAmount = ((purchaseAmount + 5) / 10) * 10;
        return 100 - roundedAmount;
    }
}
var accountBalanceAfterPurchase = function(purchaseAmount) {
    const roundedAmount = Math.floor((purchaseAmount + 5) / 10) * 10;
    return 100 - roundedAmount;
};

复杂度分析

复杂度类型数学公式法暴力枚举法
时间复杂度O(1)O(1)
空间复杂度O(1)O(1)

说明:

  • 数学公式法:直接计算,常数时间复杂度
  • 暴力枚举法:虽然需要遍历,但由于数据范围固定(最多11个倍数),仍是常数时间
  • 两种方法空间复杂度都是 O(1),只使用常数额外空间