2806.取整够买后的账户余额【简单】
题目:
一开始,你的银行账户里有 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
分析问题:
其实这道题主要就是判断总额100要减几十,那就按照题目要求写判断语句即可,另外这里需要判断purchaseAmount%10 的余数是否大于5,如果大于5的话要向上取整,否则向下取整。接下来看代码实现。
代码实现:
python
class Solution:
def accountBalanceAfterPurchase(self, purchaseAmount: int) -> int:
import math
if purchaseAmount%10>=5:
key=math.ceil(purchaseAmount/10)*10
return 100-key
elif 0<purchaseAmount%10<5:
return 100-purchaseAmount//10*10
else: return 100-purchaseAmount
总结:
这里是代码的逐步解释:
-
import math
这一行导入了
math
模块,该模块提供数学函数。在这种情况下,math.ceil()
函数用于将购买金额向上舍入到最接近的10美元的倍数。 -
if purchaseAmount%10>=5:
这个条件检查
purchaseAmount
除以10的余数是否大于或等于5。如果这个条件为真,意味着购买金额更接近下一个10美元的倍数,所以我们需要向上舍入。 -
key=math.ceil(purchaseAmount/10)*10
如果步骤2中的条件为真,这一行计算向上舍入的购买金额。
math.ceil(purchaseAmount/10)
将购买金额向上舍入到最接近的整数,然后乘以10得到下一个10美元的倍数。 -
return 100-key
在计算了四舍五入的购买金额(key)之后,这一行通过从100中减去购买金额来计算并返回剩余余额(假设账户初始金额为100美元)。
-
elif 0<purchaseAmount%10<5:
这个条件检查
purchaseAmount
除以10的余数是否大于0且小于5。如果这个条件为真,意味着购买金额更接近前一个10美元的倍数,所以我们不需要向上舍入。 -
return 100-purchaseAmount//10*10
如果步骤5中的条件为真,这一行通过直接从100中减去购买金额(向下舍入到最接近的10美元的倍数)来计算余额。使用
//
运算符进行整数除法以确保结果是整数。
总体来说,这道题并不难,在考察简单的数学问题。
3.无重复字符的最长子串【中等】
题目:
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 10**4
s
由英文字母、数字、符号和空格组成
题目分析:
这道题主要在考察字符串的处理和哈希表的运用。但其实这道题用简单的列表ls就可以解出来,我们用i遍历字符串s:
- 如果i不在ls里,则将i加到ls内,用v标记最长字符串的长度,如果len(ls)> v,就更新v的值;
- 如果i在ls里,则找到i在ls里的下标k,更新ls列表为ls[k+1:],即刚好把i以及i前面的字母全扔出去,然后ls末尾加入刚遍历到的i;此时不需要更新v的值,因为这里裁剪了ls,ls的长度只会变小或不变,不会变大。
要特别注意: 这里s的初始长度可以是0和1,并且s内的元素不一定是英文字母! 下面看一下代码实现。
代码实现:
python
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
n=len(s)
if n==0: return 0
if n==1: return 1
li=[]
v=0
for i in s:
if i not in li:
li.append(i)
if len(li)>v: v=len(li)
else:
k=li.index(i)
li=li[k+1:]
li.append(i)
return v
总结:
以下是代码的详细步骤:
- 首先获取字符串
s
的长度n
,并对一些特殊情况(长度为 0 或 1)进行处理。 - 然后创建一个列表
li
用于存储当前不重复的字符序列,以及一个变量v
用于记录最长子串的长度。 - 通过遍历字符串
s
中的每个字符,如果该字符不在li
中,就将其添加到li
中,并更新v
;如果字符已在li
中,就找到该字符在li
中的索引k
,将li
截断为从索引k+1
开始的部分,并添加当前字符。 - 最后返回计算得到的最长子串长度
v
这道题反映的要点如下:
- 滑动窗口的思想:通过动态调整窗口(这里的列表
li
)来寻找符合条件的子串。 - 对字符串的遍历和处理:如何逐一分析字符串中的字符。
- 利用列表来存储中间状态:记录已经出现的字符。
- 对重复字符的处理方式:找到重复字符的位置并进行窗口的调整。
这道题主要考查了:
- 对字符串操作的理解和掌握能力。
- 逻辑思维能力,如何设计算法来解决不重复子串的问题。
- 代码实现能力,将思路转化为实际的代码。