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

  • 博客主页:誓则盟约
  • 系列专栏:IT竞赛 专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

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的话要向上取整,否则向下取整。接下来看代码实现。


代码实现:

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

总结:

这里是代码的逐步解释:

  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内的元素不一定是英文字母! 下面看一下代码实现。

代码实现:

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

这道题反映的要点如下

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

这道题主要考查了:

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

"乱花渐欲迷人眼,浅草才能没马蹄。" ------白居易

相关推荐
浮生如梦_35 分钟前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
励志成为嵌入式工程师2 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
师太,答应老衲吧3 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer3 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
wheeldown4 小时前
【数据结构】选择排序
数据结构·算法·排序算法
观音山保我别报错5 小时前
C语言扫雷小游戏
c语言·开发语言·算法
TangKenny6 小时前
计算网络信号
java·算法·华为
景鹤6 小时前
【算法】递归+深搜:814.二叉树剪枝
算法
iiFrankie6 小时前
SCNU习题 总结与复习
算法