力扣每日一题 6/12 + 随机一题

简介: 力扣每日一题 6/12 + 随机一题

2806.取整够买后的账户余额【简单

题目:

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

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

在一个商店里,你进行一次购买,实际支出的金额会向 最近10倍数 取整。换句话说,你实际会支付一个 非负 金额 roundedAmount ,满足 roundedAmount10 的倍数且 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的话要向上取整,否则向下取整。接下来看代码实现。


代码实现:

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


总结:

这里是代码的逐步解释:

  1. import math
    这一行导入了math模块,该模块提供数学函数。在这种情况下,math.ceil()函数用于将购买金额向上舍入到最接近的10美元的倍数。
  2. if purchaseAmount%10>=5:
    这个条件检查purchaseAmount除以10的余数是否大于或等于5。如果这个条件为真,意味着购买金额更接近下一个10美元的倍数,所以我们需要向上舍入。
  3. key=math.ceil(purchaseAmount/10)*10
    如果步骤2中的条件为真,这一行计算向上舍入的购买金额。math.ceil(purchaseAmount/10)将购买金额向上舍入到最接近的整数,然后乘以10得到下一个10美元的倍数。
  4. return 100-key
    在计算了四舍五入的购买金额(key)之后,这一行通过从100中减去购买金额来计算并返回剩余余额(假设账户初始金额为100美元)。
  5. elif 0<purchaseAmount%10<5:
    这个条件检查purchaseAmount除以10的余数是否大于0且小于5。如果这个条件为真,意味着购买金额更接近前一个10美元的倍数,所以我们不需要向上舍入。
  6. 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内的元素不一定是英文字母! 下面看一下代码实现。

代码实现:

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

这道题反映的要点如下

  1. 滑动窗口的思想:通过动态调整窗口(这里的列表 li)来寻找符合条件的子串。
  2. 对字符串的遍历和处理:如何逐一分析字符串中的字符。
  3. 利用列表来存储中间状态:记录已经出现的字符。
  4. 对重复字符的处理方式:找到重复字符的位置并进行窗口的调整。

这道题主要考查了:

  1. 对字符串操作的理解和掌握能力。
  2. 逻辑思维能力,如何设计算法来解决不重复子串的问题。
  3. 代码实现能力,将思路转化为实际的代码。

 

“乱花渐欲迷人眼,浅草才能没马蹄。” ——白居易

相关文章
|
17天前
|
索引
力扣随机一题 6/26 哈希表 数组 思维
力扣随机一题 6/26 哈希表 数组 思维
12 0
|
17天前
力扣随机一题 哈希表 排序 数组
力扣随机一题 哈希表 排序 数组
10 1
|
17天前
|
算法 索引
力扣随机一题 位运算/滑动窗口/数组
力扣随机一题 位运算/滑动窗口/数组
15 0
|
17天前
力扣随机一题 6/28 数组/矩阵
力扣随机一题 6/28 数组/矩阵
14 0
|
17天前
|
Python
力扣随机一题 模拟+字符串
力扣随机一题 模拟+字符串
8 0
|
17天前
|
算法
力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学
力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学
11 0
|
2月前
|
算法 C++ 机器人
力扣 C++|一题多解之动态规划专题(1)
力扣 C++|一题多解之动态规划专题(1)
49 0
力扣 C++|一题多解之动态规划专题(1)
|
2月前
|
C++ 存储 Serverless
力扣C++|一题多解之数学题专场(2)
力扣C++|一题多解之数学题专场(2)
34 0
力扣C++|一题多解之数学题专场(2)
|
2月前
|
C++ 存储
力扣C++|一题多解之数学题专场(1)
力扣C++|一题多解之数学题专场(1)
31 0
力扣C++|一题多解之数学题专场(1)
|
存储 Python
力扣每日一题:7.整数反转 一题三解,带你逐层深入
力扣每日一题:7.整数反转 一题三解,带你逐层深入
82 0