LeetCode刷题合集

203.移除链表元素

定位到需要删除节点的上一个节点 cur,将其指向下下个节点。
class Solution:def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:dummy_head = ListNode(val = 0, next = head)cur = dummy_headwhile cur and cur.next:if cur.next.val == val:cur.next = cur.next.nextelse:cur = cur.nextreturn dummy_head.next

83.删除排序链表中的重复元素

与上一题是一样的思路。由于删除后,重复元素只出现一次,因此头节点不需要删除,无需 dummy_head。

class Solution:def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:cur = headwhile cur and cur.next:if cur.next.val == cur.val:cur.next = cur.next.nextelse:cur = cur.nextreturn head

82.删除排序链表中的重复元素II

与上一题不同的是,这次我们需要完全删除所有重复元素。因此我们定位到要删除元素的前一个节点。

class Solution:def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:dummy_head = ListNode(val = 0, next = head)cur = dummy_headwhile cur and cur.next and cur.next.next:if cur.next.val == cur.next.next.val:repeat_val = cur.next.valwhile cur.next and cur.next.val == repeat_val:cur.next = cur.next.nextelse:cur = cur.nextreturn dummy_head.next

112.路径总和

  1. 基本情况处理
    • 当前节点为 None 时,直接返回 False,因为空节点不构成路径。
  2. 检查叶子节点
    • 当前节点既没有左子节点也没有右子节点(即是叶子节点),检查其值是否与剩余的 targetSum 相等。如果相等,说明找到了一条有效路径,返回 True
  3. 递归求解
    • 如果不是叶子节点,或者叶子节点的值不等于 targetSum,则递归地在左右子树中寻找是否存在符合条件的路径。
    • 递归调用时,更新 targetSumtargetSum - root.val,表示从当前节点向下寻找路径时,剩余的目标和需要减去当前节点的值。
class Solution:def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:if not root:return Falseif not root.left and not root.right and targetSum == root.val:return Truereturn self.hasPathSum(root.left, targetSum - root.val) or self.hasPathSum(root.right, targetSum - root.val)

113.路径总和II

和112的区别是,需要记录路径。

class Solution:def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]:res, path = [], []def dfs(node, currentSum):if not node:returnpath.append(node.val)if not node.left and not node.right and currentSum == node.val:res.append(path[:])dfs(node.left, currentSum - node.val)dfs(node.right, currentSum - node.val)path.pop()dfs(root, targetSum)return res

437.路径总和III

  1. countPathsFromNode 函数:

    • 这是一个递归函数,用于计算从当前节点 node 开始,向下所有可能的路径中,值之和等于 currentSum 的路径数量。
    • 函数首先检查当前节点是否为 None。如果是,说明已经到达了叶子节点之下的位置,返回 0。
    • 如果当前节点的值恰好等于 currentSum,说明从某个上层节点到当前节点的路径和正好是 targetSum,此时 count 加一。
    • 接下来递归地在左右子树中查找减去当前节点值后,路径和为 currentSum - node.val 的路径数量。
  2. pathSum 函数:

    • 这个函数负责三件事:
      1. 调用 countPathsFromNode 来找出以当前节点(即根节点)为起点的所有符合条件的路径。
      2. 递归地在左子树中查找符合条件的路径数量。
      3. 递归地在右子树中查找符合条件的路径数量。
    • 通过将这三部分的结果相加,得到了整棵树中符合条件的路径总数。
class Solution:def pathSum(self, root: Optional[TreeNode], targetSum: int) -> int:# 从指定节点开始,计算以当前节点为起点的符合条件的路径数量def countPathsFromNode(node, currentSum):if not node:return 0  # 如果节点为空,直接返回0count = 0# 如果当前节点的值等于剩余所需的sum值,那么找到了一条符合条件的路径if node.val == currentSum:count += 1# 递归计算左子树中的符合条件的路径数量count += countPathsFromNode(node.left, currentSum - node.val)# 递归计算右子树中的符合条件的路径数量count += countPathsFromNode(node.right, currentSum - node.val)return countif not root:return 0  # 如果根节点为空,则返回0# 计算以根节点为起点的路径数量res = countPathsFromNode(root, targetSum)# 递归计算左子树中的路径数量res += self.pathSum(root.left, targetSum)# 递归计算右子树中的路径数量res += self.pathSum(root.right, targetSum)return res

151.反转字符串中的单词 

  • .split() 去除空格,将单词存为数组
  • 双指针调整单词位置
  • ' '.join() 重新转为 string,单词间空格隔开
class Solution:def reverseWords(self, s: str) -> str:words = s.split()left, right = 0, len(words) - 1while left < right:words[left], words[right] = words[right], words[left]left += 1right -= 1return ' '.join(words)

我们也可以不使用内置函数 split():

  • 去除首尾空格
  • 去除单词间多余空格,确保单词由1个空格隔开
  • 反转整体
  • 反转单词
class Solution:def reverseWords(self, s: str) -> str:# 因为python字符串不可变,将字符串转为列表s_list = []left, right = 0, len(s) - 1# 去除首位空格while left < len(s) and s[left] == ' ':left += 1while right > 0 and s[right] == ' ':right -= 1# 去除单词间多余空格for i in range(left, right + 1):if s[i] != ' ':s_list.append(s[i])else:if s_list[-1] != ' ':s_list.append(s[i])# 定义反转函数def reverse(left, right):while left < right:s_list[left], s_list[right] = s_list[right], s_list[left]left += 1right -= 1# 反转整体left, right = 0, len(s_list) - 1reverse(left, right)# 反转单词n = len(s_list)start = 0for i in range(n):if s_list[i] == ' ':reverse(start, i - 1)start = i + 1if i == n - 1:reverse(start, i)return ''.join(s_list)

186.反转字符串中的单词II

与上一题不同的是,本题的输入为数组,每个字符都是一个元素。采取以下策略:

  1. 反转整个字符串数组:首先,将整个字符数组 s 完全反转。这一步会使得所有单词的顺序完全颠倒,但单词内部的字符顺序也被反转了。
  2. 反转每个单词:接下来,遍历反转后的数组,并反转每个单词内的字符。单词的界定是由空格分隔的非空格字符序列。
class Solution:def reverseWords(self, s: List[str]) -> None:"""Do not return anything, modify s in-place instead."""# 定义反转函数def reverse(start, end):while start < end:s[start], s[end] = s[end], s[start]start += 1end -= 1# 反转整体reverse(0, len(s) - 1)# 反转每个单词# 初始化首个单词的起始位置start = 0for i in range(len(s)):# 定位每个单词的末尾位置if s[i] == ' ':reverse(start, i - 1)# 更新下一个单词的起始位置start = i + 1# 最后一个单词的末尾位置无法通过空格定位elif i == len(s) - 1:reverse(start, i)

557.反转字符串中的单词III

本题只需反转单词。

class Solution:def reverseWords(self, s: str) -> str:words = s.split()def reverse(word):my_list = list(word)start, end = 0, len(my_list) - 1while start < end:my_list[start], my_list[end] = my_list[end], my_list[start]start += 1end -= 1return ''.join(my_list)# 反转每个单词for i in range(len(words)):words[i] = reverse(words[i])return ' '.join(words)

179.最大数

思路:

  • 对于两个数字 ab ,比较两种连接方式 a+bb+a 的结果。
  • 如果 a+b > b+a,则 a 应该排在 b 之前。反之,则 b 应该排在 a 前面。

举例 nums[56, 6, 60]

  1. 我们比较任意两个字符串 xy,看 x+yy+x 的大小:
    • 比较 56 和 6: 566 < 656,所以 6 应该排在 56 前面。
    • 比较 6 和 60: 660 > 606,所以 6 应该排在 60 前面。
    • 比较 56 和 60: 5660 < 6056,所以 60 应该排在 56 前面。
  2. 根据这些比较,排序结果是 [6, 60, 56]。连接这些字符串得到最终结果 "66056"。
class Solution:def largestNumber(self, nums: List[int]) -> str:# 自定义排序def custom_compare(a, b):if a + b > b + a:return -1elif a + b < b + a:return 1else:return 0# 题目要求输出字符串str_nums = map(str, nums)sorted_nums = sorted(str_nums, key = cmp_to_key(custom_compare))# 如果首位是0,则说明后续元素全为0,为避免诸如'00'这样的输出。return ''.join(sorted_nums) if sorted_nums[0] != '0' else '0'

22.括号生成

我们可以使用回溯来解决,问题的关键在于如何确保括号的合法性:

  • 左括号的数量始终不超过 n:在添加左括号时,只有当已添加的左括号数量小于 n 时,才可以添加一个左括号。这确保了左括号不会超过它们的总数。

  • 右括号的数量始终不超过左括号:在添加右括号时,只有当已添加的右括号数量小于已添加的左括号数量时,才可以添加一个右括号。

class Solution:def generateParenthesis(self, n: int) -> List[str]:res = []def backtrack(s, left, right):# 递归终止条件if len(s) == 2 * n:res.append(s)returnif left < n:backtrack(s + '(', left + 1, right)if right < left:backtrack(s + ')', left, right + 1)backtrack('', 0, 0)return res

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/2393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux进程详解二:创建、状态、进程排队

文章目录 进程创建进程状态进程排队 进程创建 pid_t fork(void) 创建一个子进程成功将子进程的pid返回给父进程&#xff0c;0返回给新创建的子进程 fork之后有两个执行分支&#xff08;父和子&#xff09;&#xff0c;fork之后代码共享 bash -> 父 -> 子 创建一个进…

土地分类——基于Sentinel-2多源遥感的无监督分类进行土地分类

简介 无监督分类是一种基于统计学方法的图像分类技术,不需要先验知识和训练样本,直接对图像进行分类。基于Sentinel-2多源遥感数据进行无监督分类可以实现对土地类型的划分。本教程主要的目的是通过多源遥感影像进行土地分类,这里主要的数据是哨兵2号数据,波段+纹理特征,…

比特币成长的代价

作者&#xff1a;Jeffrey Tucker&#xff0c;作家和总裁。曾就经济、技术、社会哲学和文化等话题广泛发表演讲。编译&#xff1a;秦晋 2017 年之后参与比特币市场的人遇到了与之前的人不同的操作和理想。如今&#xff0c;没有人会太在意之前的事情&#xff0c;说的是 2010-2016…

prompt提示词:影响力营销文案,让AI 帮你写营销文案

影响力营销文案提问技巧 1&#xff0e;我正在寻找一个有影响力的营销活动大纲&#xff0c;向我的[理想客户角色]展示我的[产品/服务]&#xff0c;并说服他们在符合我们品牌价值的[有影响力的类型]的帮助下采取[期望的行动] 2&#xff0e;我需要一个有影响力的营销活动大纲&am…

【全网首发】Mogdb 5.0.6新特性:CM双网卡生产落地方案

在写这篇文章的时候&#xff0c;刚刚加班结束&#xff0c;顺手写了这篇文章。 前言 某大型全国性行业核心系统数据库需要A、B两个物理隔离的双网卡架构方案&#xff0c;已成为行业标准。而最新发布的MogDB 5.0.6的CM新增支持流复制双网段部署&#xff0c;用于网卡级高可用容灾(…

【Linux开发实用篇】备份与恢复

备份 实体机无法做快照&#xff0c;我们可以使用备份和恢复技术 第一种方式 把需要的文件&#xff08;或者分区&#xff09;用TAR打包就好&#xff0c;下次恢复的时候进行解压 第二种方式 使用dump 和 restore 指令&#xff1a; 首先安装这两个指令 yum -y install dump, …

参数传递 的案例

文章目录 12 1 输出一个int类型的数组&#xff0c;要求为&#xff1a; [11,22,33,44,55] package com.zhang.parameter; //有关方法的案例 public class MethodTest3 {public static void main(String[] args) {//输出一个int类型的数组&#xff0c;要求为&#xff1a; [11,…

《前端面试题》- TypeScript - TypeScript的优/缺点

问题 简述TypeScript的优/缺点 答案 优点 增强了代码的可读性和可维护性包容性&#xff0c;js可以直接改成ts&#xff0c;ts编译报错也可以生成js文件&#xff0c;兼容第三方库&#xff0c;即使不是ts编写的社区活跃&#xff0c;完全支持es6 缺点 增加学习成本增加开发成…

Debezium分享系列之:Debezium2.6稳定版本Oracle数据库Debezium Connector的属性参数详解

Debezium分享系列之:Debezium2.6稳定版本Oracle数据库Debezium Connector的属性参数详解 一、连接器属性二、必需的 Debezium Oracle 连接器配置属性三、Debezium Oracle 连接器数据库架构历史配置属性四、用于配置生产者和消费者客户端的传递数据库架构历史属性五、Debezium …

Android studio顶部‘app‘红叉- Moudle ‘XX.app’ dosen’t exist in project

Android studio顶部app红叉- Moudle ‘XX.app’ dosen’t exist in project 1、现象&#xff1a; 运行老项目或者有时候替换项目中的部分代码&#xff0c;明明没有错但是Android studio就编译报错了。 1.1 Android studio顶部app红叉。 1.2 点击Build没有clear菜单&#xff0…

行为审计软件合集|3款好用的上网行为管控软件推荐

网络技术的快速发展使得企业对于员工上网行为的管控需求也日益增强。 上网行为管控软件不仅可以有效监控员工的网络活动&#xff0c;提高工作效率&#xff0c;还可以防止敏感信息的泄露&#xff0c;保障企业的网络安全。 本文将为您推荐三款好用的上网行为管控软件&#xff1a…

『视觉感官盛宴』3D线上商场全方位展示商品与互动购买体验

随着技术的进步和消费者需求的多样化&#xff0c;3D线上商场作为一种新兴的电子商务平台&#xff0c;正逐渐改变传统的在线购物模式。 一、商品展示革命 在3D线上商场中&#xff0c;商品展示不再局限于静态图片和文字描述。借助先进的3D建模技术&#xff0c;商家能够创建商…

在Python中,设置数据权限通常涉及到多个方面,包括数据访问控制、数据加密、数据验证等

在Python中&#xff0c;设置数据权限通常涉及到多个方面&#xff0c;包括数据访问控制、数据加密、数据验证等。具体实现方式取决于你的应用程序架构和数据存储方式。以下是一些常见的方法来实现数据权限的设置&#xff1a; 使用角色和权限系统&#xff1a; 创建一个角色和权…

Centos sudo权限错误

今天安装Ansible受控端服务器时&#xff0c;发现有一台服务器sudo报错&#xff0c;经查&#xff0c;发现是sudo权限被配错了&#xff0c;我估计是之前谁给777了。对照另外一台修改恢复了。 错误 setuid权限错误 错误提示 sudo: effective uid is not 0, is sudo installed …

【ARM Coresight 系列文章19.3 -- ARM DSU 120 Debug block】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 ARM DSU-120 Debug BlockCluster debug componentsCache DebugDSU-120 Cache Debug 特性应用场景Terminology处理元素(PE)调试支持应用场景总结

1557.可以到达所有点的最少点数目

题目 给你一个 有向无环图 &#xff0c; n 个节点编号为 0 到 n-1 &#xff0c;以及一个边数组 edges &#xff0c;其中 edges[i] [fromi, toi] 表示一条从点 fromi 到点 toi 的有向边。 找到最小的点集使得从这些点出发能到达图中所有点。题目保证解存在且唯一。 你可以以…

电磁仿真--基本操作-CST-(2)

目录 1. 回顾基操 2. 操作流程 2.1 创建工程 2.2 修改单位 2.3 创建 Shape 2.4 使用拉伸 Extrude 2.5 修改形状 Modify Locally 2.6 导入材料 2.7 材料解释 2.8 材料分配 2.9 查看已分配的材料 2.10 设置频率、背景和边界 2.11 选择 Edge&#xff0c;设置端口 2.…

【网络编程】Java网络编程中的基本概念及实现UDP、TCP客户端服务器程序(万字博文)

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】Java网络编程中的基本概念及实现UDP、TCP客户端服务器程序&#xff08;万字博文&#xff09; 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制&#xff08;CRC算法、MD5算法&#xff09; 目录 …

公园景区伴随音乐系统-公园景区数字IP广播伴随音乐系统建设指南

公园景区伴随音乐系统-公园景区数字IP广播伴随音乐系统建设指南 由北京海特伟业任洪卓发布于2024年4月23日 随着“互联网”被提升为国家战略&#xff0c;传统行业与互联网的深度融合正在如火如荼地展开。在这一大背景下&#xff0c;海特伟业紧跟时代步伐&#xff0c;凭借其深厚…

linux常用非基础命令/操作

本篇用于总结蒟蒻博主在使用linux系统的过程中会经常用到但老实记不住的一些非基础命令和操作&#xff0c;方便遗忘时查阅 一&#xff0c;关闭指定端口的进程以释放端口 每个端口都有一个守护进程&#xff0c;kill掉这个守护进程就可以释放端口 ①使用命令【netstat -anp | gre…