
获得徽章 0
- #刷题交流# 刷题打卡地84题:def solution(n: int, k: int, num_str: str) -> int:
assert n == len(num_str)
ans = 0
mod = 10 ** 9 + 7
for _ in range(k):
t = ""
for ch in num_str:
t += str(1 + int(ch))
num_str = t
for ch in num_str:
ans = (ans * 10 + int(ch)) % mod
return ans
if __name__ == '__main__':
print(solution(n = 3 ,k = 1 ,num_str = "798") == 8109)
print(solution(n = 3 ,k = 3 ,num_str = "798") == 103221)
print(solution(n = 4 ,k = 3 ,num_str = "7989") == 10322132)展开1点赞 - #刷题交流# 刷题打卡:小U是一位古生物学家,正在研究不同物种之间的血缘关系。为了分析两种古生物的血缘远近,她需要比较它们的DNA序列。DNA由四种核苷酸A、C、G、T组成,并且可能通过三种方式发生变异:添加一个核苷酸、删除一个核苷酸或替换一个核苷酸。小U认为两条DNA序列之间的最小变异次数可以反映它们之间的血缘关系:变异次数越少,血缘关系越近。
def solution(dna1, dna2):
# 初始化dp数组
dp = [[0] * (len(dna2) + 1) for _ in range(len(dna1) + 1)]
# 边界条件
for i in range(1, len(dna1) + 1):
dp[i][0] = i
for j in range(1, len(dna2) + 1):
dp[0][j] = j
# 状态转移
for i in range(1, len(dna1) + 1):
for j in range(1, len(dna2) + 1):
if dna1[i-1] == dna2[j-1]:
dp[i][j] = dp[i-1][j-1]
else:
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
# 返回结果
return dp[len(dna1)][len(dna2)]
if __name__ == "__main__":
# 你可以添加更多测试用例
print(solution("AGT", "AGCT") == 1)
print(solution("", "ACGT") == 4)
print(solution("GCTAGCAT", "ACGT") == 5)展开评论点赞 - #刷题交流# 天气越来越冷了,村子里有留守老人缺少照顾,会在这个冬天里挨冻,小R想运用自己的知识帮帮他们。已知村庄里每户人家作为一个节点,这些节点可以组成一个二叉树。我们可以在二叉树的节点上供应暖炉,每个暖炉可以为该节点的父节点、自身及其子节点带来温暖。给定一棵二叉树,求使整个村庄都暖和起来至少需要供应多少个暖炉?
from collections import deque
from dataclasses import dataclass
from typing import Optional
@dataclass
class TreeNode:
left: Optional['TreeNode'] = None
right: Optional['TreeNode'] = None
def solution(nodes: list) -> int:
rt = TreeNode()
q1 = deque(nodes[1:])
q2 = deque([rt])
while q1:
u = q2.popleft()
if q1 and q1.popleft():
v = TreeNode()
u.left = v
q2.append(v)
if q1 and q1.popleft():
v = TreeNode()
u.right = v
q2.append(v)展开1点赞 - #刷题交流# 今天来打卡啦,给你一个整数数组 nums 和一个整数 k,请你用一个字符串返回其中出现频率前 k 高的元素。请按升序排列。
def solution(nums: list, k: int) -> str:
# from collections import Counter
# c = Counter(nums)
# return ','.join([str(v[0]) for v in c.most_common(k)])
# 统计每个元素的频率
import heapq
from collections import Counter
frequency = Counter(nums)
# 使用小根堆来存储频率最高的 k 个元素
heap = []
for num, freq in frequency.items():
heapq.heappush(heap, (freq, num))
if len(heap) > k:
heapq.heappop(heap)
# 提取堆中的元素并按升序排序
result = [num for freq, num in heap]
result.sort()
return ','.join([str(num) for num in result])
if __name__ == '__main__':
print(solution(nums=[1, 1, 1, 2, 2, 3], k=2) == "1,2")
print(solution(nums=[1], k=1) == "1")
print(solution(nums=[4, 4, 4, 2, 2, 2, 3, 3, 1], k=2) == "2,4")展开评论点赞 - #刷题交流# day17打卡:小R拿到了一个长度为n的数组,其中每个元素都是一个正整数。小R发现每次可以删除某个数组中某个数的一位数字,这样可以逐步将所有数字变为0。他想知道,要将数组中所有数字都变为0,最少需要多少步?
def solution(n: int, a: list) -> int:
assert n == len(a)
s = "".join(str(x) for x in a)
return len(s) - s.count('0')
if __name__ == '__main__':
print(solution(n = 5,a = [10, 13, 22, 100, 30]) == 7)
print(solution(n = 3,a = [5, 50, 505]) == 4)
print(solution(n = 4,a = [1000, 1, 10, 100]) == 4)展开评论点赞