leetcode每日一题:3099
这道题非常简单,只需要看一下这个数的各位之和是否可以整除这个数就可以了,但是,就是这么简单的一道题,让我学到了一个小小的知识点,也就是后面的优化版。
我的方法很粗鄙,就是转化为字符串进行求和。
时间复杂度: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分析):
-
kv = collections.defaultdict(list)
- 这一行创建了一个空的 defaultdict(默认字典),其中每个值的默认类型是一个空列表。这意味着当你访问字典中不存在的键时,它会自动创建一个空列表作为该键的默认值。
-
for s in strs:
- 这一行开始了一个
for
循环,遍历输入的字符串列表strs
中的每一个字符串。在每次迭代中,当前字符串被赋值给变量s
。
- 这一行开始了一个
-
"".join(sorted(s))
- 这一行对字符串
s
进行排序,并将排序后的字符重新组合成一个新的字符串。例如,对于输入的字符串 "cba",排序后会变成 "abc"。
- 这一行对字符串
-
kv["".join(sorted(s))].append(s)
- 这一行是核心操作:
sorted(s)
对字符串s
进行排序,返回其字符的有序列表。"".join(sorted(s))
将排序后的字符列表拼接成一个新的字符串作为字典kv
的键。kv["".join(sorted(s))]
获取字典kv
中以排序后的字符串为键的列表值。.append(s)
将原始字符串s
添加到对应键的列表中。这样做的结果是,具有相同字母构成的字符串被放入同一个键所对应的列表中。
- 这一行是核心操作:
-
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