Day4
目标: 1、用python完成leecode两数之和 2、用python完成字符串匹配 3、用python完成二叉树的层序遍历 4、学习了Python语言编程规范第一部分
刷题日记: 2025.12.16 1.1两数相加 twoSum.py 2.28找出字符串中第一个匹配项的下标 strStr.py 字符串拼接处理、双指针 3.102二叉树的层序遍历 levelOrder.py 队列 先进先出 bfs dfs
完成: #两数相加 #给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 class Solution: def twoSum(self, num: list[int], target: int) -> list[int]: # 字典存数据 (map) num_dict = {} for index, value in enumerate(num): num_dict[value] = index for index, value in enumerate(num): if target - value in num_dict and index != num_dict[target - value]: return [index, num_dict[target - value]] return []
print(Solution().twoSum([2, 7, 11, 15], 9)) print(Solution().twoSum([3, 2, 4], 6)) print(Solution().twoSum([3,3], 6))
#28找出字符串中第一个匹配项的下标 #给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
class Solution: def strStr(self, haystack: str, needle: str) -> int: return haystack.find(needle)
▼text复制代码def strStr2(self, haystack: str, needle: str) -> int: m, n = len(needle), len(haystack) for i in range(n - m + 1): # 窗口起始位置 # 截取子串,判断是否与目标子串匹配 if haystack[i:i + m] == needle: return i return -1 # 双指针 # 使用两个指针分别遍历 haystack 和 needle,当字符匹配时同时前进,不匹配时回退,重新继续匹配下一个位置。 def strStr3(self, haystack: str, needle: str) -> int: n, m = len(haystack), len(needle) if m == 0: return 0 if n< m: return -1 for i in range(n - m + 1): j = 0 #双指针匹配 while j < m and haystack[i+j] == needle[j]: j = j + 1 if j == m: #完全匹配 return i return -1
print(Solution().strStr3("hello", "ll"))
#二叉树的层序遍历 #给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 #题解中对bfs dfs解释的比较好的 https://leetcode.cn/problems/binary-tree-level-order-traversal/solutions/244853/bfs-de-shi-yong-chang-jing-zong-jie-ceng-xu-bian-l from collections import deque from typing import Optional, List
class TreeNode: def init(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class Solution: def levelOrder(self, root: TreeNode) -> List[List[int]]: # 先判空 if not root: return [] # 定义队列 双端队列 queue = deque() res = [] #先加入根节点 queue.append(root) while queue: level_nodes = [] queue_size = len(queue) for i in range(queue_size): node = queue.popleft() level_nodes.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) res.append(level_nodes) return res
python编程规范简记 命名: 明确含义,尽量简短 类(Class)名使用意义完整的英文描述,采用大写字母开头的单词(CapWords)风格命名 eg: Person 函数(Function)、方法(Method)使用意义完整的英文描述,动词、介词和名词,采用小写加下划线(lower_with_under)的风格命名 eg: to_string() ps: 私有__ 成员_ 变量(Variable)、类的数据成员、函数的参数(Parameter)采用小写加下划线 (lower_with_under)的风格命名。 eg: person_age 常量(Constant) 采用全大写加下划线(CAPS_WITH_UNDER)的风格命名。 eg: XXX_QUERY_URL 实例方法的第一个参数是self, 类方法的第一个参数是cls
注释: 模块文档字符串写在文件的顶部,在导入之前,不需要缩进, """开始 """结束 类的文档字符串写在类声明所在行的下一行,并向后缩进4个空格, """开始 """结束 代码的注释位置、格式、缩进在项目内保持统一,放在被注释代码块的上方相邻位置,使用#开头,#后面一个空格然后写注释文本,代码行的行尾添加注释,注释应该至少离开代码2个空格,#后面一个空格然后写注释文本。
格式: 采用4个空格缩进风格编写 行宽不超过120个字符 类中的方法定义之间空一行 相对独立的逻辑代码块之间,变量说明之后建议空一行 用空格突出关键字和重要信息,逗号、分号、冒号(假如用到的话)只在后面加空格、操作符前后加空格、冒号前不应使用空格,冒号后需要加空格、括号内侧,左括号后面和右括号前面,不需要加空格,多重括号间不必加空格。
