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),只使用常数额外空间