leetcode每日一题 + 今日刷题

leetcode每日一题:3099

3099. 哈沙德数 - 力扣(LeetCode)

这道题非常简单,只需要看一下这个数的各位之和是否可以整除这个数就可以了,但是,就是这么简单的一道题,让我学到了一个小小的知识点,也就是后面的优化版。

我的方法很粗鄙,就是转化为字符串进行求和。

时间复杂度:O(n)

空间复杂度:O(1)

class Solution:
    def sumOfTheDigitsOfHarshadNumber(self, x: int) -> int:
        a = str(x)
        ans = 0
        for i in a:
            ans += int(i)
        return -1 if x % ans != 0 else ans

优化:

当我看完灵神的做法   

我学到了:

divmod函数 + while循环直接求

时间复杂度:O(logn)

空间复杂度:O(1)

class Solution:
    def sumOfTheDigitsOfHarshadNumber(self, x: int) -> int:
        s = 0
        v = x
        while v:
            v, d = divmod(v, 10)
            s += d
        return -1 if x % s else s

leetcode49(微软题库)

这道题我的做法是使用python的字典用来统计

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        dic = {}
        ans = []
        for s in strs:
            dic1 = {}
            for i in range(26):
                dic1[chr(ord('a') + i)] = 0
            for i in s:
                dic1[i] += 1
            a = ''
            for key,value in dic1.items():
                a += (key + str(value))
            if a in dic:
                dic[a].append(s)
            else:
                dic[a] = [s] 
        for key,value in dic.items():
            ans.append(value)
        return ans

当我看见别人的代码的时候,我只能说我

红温了!!!彻底红温了!!!

别人的代码:

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        kv = collections.defaultdict(list)
        for s in strs:
            kv["".join(sorted(s))].append(s)
        
        return list(kv.values())

别人代码的数据:

经过我的细心研究(ai分析):

  1. kv = collections.defaultdict(list)

    • 这一行创建了一个空的 defaultdict(默认字典),其中每个值的默认类型是一个空列表。这意味着当你访问字典中不存在的键时,它会自动创建一个空列表作为该键的默认值。
  2. for s in strs:

    • 这一行开始了一个 for 循环,遍历输入的字符串列表 strs 中的每一个字符串。在每次迭代中,当前字符串被赋值给变量 s
  3. "".join(sorted(s))

    • 这一行对字符串 s 进行排序,并将排序后的字符重新组合成一个新的字符串。例如,对于输入的字符串 "cba",排序后会变成 "abc"。
  4. kv["".join(sorted(s))].append(s)

    • 这一行是核心操作:
      • sorted(s) 对字符串 s 进行排序,返回其字符的有序列表。
      • "".join(sorted(s)) 将排序后的字符列表拼接成一个新的字符串作为字典 kv 的键。
      • kv["".join(sorted(s))] 获取字典 kv 中以排序后的字符串为键的列表值。
      • .append(s) 将原始字符串 s 添加到对应键的列表中。这样做的结果是,具有相同字母构成的字符串被放入同一个键所对应的列表中。
  5. return list(kv.values())

    • 最后,这一行将 kv 字典中所有的值(即每个键对应的列表)转换为一个列表,并返回该列表作为函数的输出。

你悟了吗?

leetcode238(微软题库)

238. 除自身以外数组的乘积 - 力扣(LeetCode)

这道题也是用到了前缀乘法和后缀乘法(自己取的名字 嘿嘿)

pre:前面那些数的乘数的数组

suf:后面那些数的乘数的数组

ans:答案数组:pre[i - 1] * suf[i + 1]的结果加上两个边界就是最终答案

class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        n = len(nums)
        pre = [1] * n
        suf = [1] * n
        pre[0] = nums[0]
        suf[-1] = nums[-1]
        for i in range(1,n):
            pre[i] = nums[i] * pre[i - 1]
        for i in range(n - 2,-1,-1):
            suf[i] = suf[i + 1] * nums[i]
        ans = []
        for i in range(n):
            if i != 0 and i != n - 1:
                ans.append(pre[i - 1] * suf[i + 1])
            elif i == 0:
                ans.append(suf[i + 1])
            elif i == n - 1:
                ans.append(pre[i - 1])
        return ans

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值