面试手撕合集

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

定义单个指针 cur,指向虚拟头节点。如果 cur.next == cur.next.next,说明 cur 后面的两个节点重复,例如 节点2 后面存在 2个节点3。我们令 节点2 -> 节点4,实现删除两个节点3的操作。

class Solution:def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:dummyhead = ListNode(val = 0, next = head)cur = dummyheadwhile cur.next and cur.next.next:if cur.next.val == cur.next.next.val:repeat_val = cur.next.val# 跳过某段重复while cur.next and cur.next.val == repeat_val:cur.next = cur.next.nextelse:cur = cur.nextreturn dummyhead.next

240.搜索二维矩阵II

利用矩阵的递增性质:从左下角元素开始搜索,同列元素都小于此元素,同行元素都大于此元素。因此和 target 比较后,我们可以立即排除一行或者一列的元素。如下图:从右上角开始同理,这是由于这两处的元素大小处在所在行和列的所有元素中间,可以利用二分思想缩减搜索规模。而左上和右下角的元素处在所在行和列的所有元素的两端。

 

class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:# 起始点定在矩阵左下角i, j = len(matrix) - 1, 0while i >= 0 and j <= len(matrix[0]) - 1:if matrix[i][j] > target:i -= 1elif matrix[i][j] < target:j += 1else:return Truereturn False

冒泡排序

  • 遍历数组,每次交换相邻两个元素,一次遍历后,最大的数将会被移至末尾。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
  • 时间复杂度为 O(n^2)
def bubble_sort(arr):n = len(arr)# 遍历所有数组元素for i in range(n):for j in range(0, n-i-1):# 遍历数组从0到n-i-1# 交换如果元素大于下一个元素if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]return arr

快速排序

  • 选择基准值:从数组中选择一个元素作为基准值。选择方法有多种,如选择第一个元素、最后一个元素、中间元素等。

  • 分区操作:重新排列数组,使得所有小于基准值的元素都排在基准前面,而所有大于基准值的元素都排在基准的后面(相等的数可以到任一边)。在这个分区退出之后,该基准就处于数组的中间位置。

  • 递归排序:递归地将小于基准值的子数组和大于基准值的子数组排序。

  • 时间复杂度为O(n log n)

def quick_sort(arr):# 分区函数:根据pivot(基准值)将数组分为两部分def partition(left, right):pivot = arr[left]  # 选择左边界的元素作为pivotwhile left < right:# 从右向左扫描,找到第一个小于pivot的元素,移动到左边while left < right and arr[right] >= pivot:right -= 1arr[left] = arr[right]# 从左向右扫描,找到第一个大于pivot的元素,移动到右边while left < right and arr[left] <= pivot:left += 1arr[right] = arr[left]# 循环结束,left和right相遇,这是pivot的正确位置,将pivot放回arr[left] = pivotreturn left  # 返回pivot的位置# 递归排序的辅助函数def quick_sort_recursive(left, right):if left < right:  # 至少包含两个元素的区间才需要排序pi = partition(left, right)  # 对当前区间进行分区,得到pivot的位置quick_sort_recursive(left, pi - 1)  # 递归排序pivot左侧的子数组quick_sort_recursive(pi + 1, right)  # 递归排序pivot右侧的子数组quick_sort_recursive(0, len(arr) - 1)  # 对整个数组进行快速排序return arr  # 返回排序后的数组

538.把二叉搜索树转换为累加树 

累加树(Greater Sum Tree)常见于二叉搜索树(Binary Search Tree)的变体。在累加树中,每个节点的值被修改为原始二叉搜索树中所有大于或等于该节点值的节点值之和。

举例

有以下BST:

反向中序遍历(右中左)

我们遍历的顺序是:9 -> 8 -> 5 -> 4 -> 3 -> 2。遍历时,我们累计已经访问过的节点值的和,并将这个累积和赋给当前节点。

  • 访问节点 9:当前累积和 = 9,更新节点 9 的值为 9
  • 访问节点 8:当前累积和 = 9 + 8 = 17,更新节点 8 的值为 17
  • 访问节点 5:当前累积和 = 17 + 5 = 22,更新节点 5 的值为 22
  • 访问节点 4:当前累积和 = 22 + 4 = 26,更新节点 4 的值为 26
  • 访问节点 3:当前累积和 = 26 + 3 = 29,更新节点 3 的值为 29
  • 访问节点 2:当前累积和 = 29 + 2 = 31,更新节点 2 的值为 31

class Solution:def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:self.sum = 0def dfs(node):# 递归终止条件if not node:return# 反向中序(右 -> 中 -> 左)# 右dfs(node.right)# 中self.sum += node.valnode.val = self.sum  # 更新节点值# 左dfs(node.left)dfs(root)return root

1743.从相邻元素对还原数组

数组元素各不相同,有以下观察:

  • 每个元素(除了首尾元素)都会有两个相邻元素:前一个和后一个。
  • 数组的首元素 只有一个相邻元素,即它后面的元素。
  • 数组的尾元素 同样只有一个相邻元素,即它前面的元素。

因此,在从 adjacentPairs 构建的 adj_map 中,大多数键(代表 nums 中的元素)都会有两个条目在其对应的列表中,这两个条目分别表示它的前一个和后一个相邻元素。例外的是 nums 的首尾元素,它们在 adj_map 中的列表长度将是 1,因为它们各自只有一个相邻元素。

举例说明

考虑数组 nums = [1, 2, 3, 4],其相邻元素对可能包括:

  • [1, 2]
  • [2, 3]
  • [3, 4]

在通过这些对构建 adj_map 后,其内容将是:

  • 1 -> [2]
  • 2 -> [1, 3]
  • 3 -> [2, 4]
  • 4 -> [3]

由于顺序不限,我们随意选择其中一个长度为 1 的键作为起点,然后根据相邻关系依次添加元素到结果数组中,直到所有元素都被添加。

class Solution:def restoreArray(self, adjacentPairs: List[List[int]]) -> List[int]:n = len(adjacentPairs) + 1# 构建关系哈希表adj_map = defaultdict(list)for u, v in adjacentPairs:adj_map[u].append(v)adj_map[v].append(u)# 找到 nums 的起始元素for key, val in adj_map.items():if len(val) == 1:start = keybreak# 构建 numsnums = []nums.append(start)nums.append(adj_map[start][0])while len(nums) < n:cur_val = nums[-1]pre_val = nums[-2]for next_val in adj_map[cur_val]:# cur_val键对应的值包含cur_val的前一个和后一个元素# 对于cur_val的后一个元素的确定,我们需要避免重复选择cur_val的前一个元素(pre_val)if next_val != pre_val:nums.append(next_val)else:continuereturn nums

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

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

相关文章

机器人方向控制中应用的磁阻角度传感芯片

磁阻传感器提供的输出信号几乎不受磁场变动、磁温度系数、磁传感器距离与位置变动影响&#xff0c;可以达到高准确度与高效能&#xff0c;因此相当适合各种要求严格的车用电子与工业控制的应用。所以它远比采用其它传感方法的器件更具有优势。 机器人的应用日渐广泛&#xff0…

Linux Debian安装教程

Debian 是一个免费的开源操作系统&#xff0c;是最古老的 Linux 发行版之一&#xff0c;于 1993 年由 Ian Murdock 创建。它采用了自由软件协议&#xff0c;并且由志愿者社区维护和支持。Debian 的目标是创建一个稳定、安全且易于维护的操作系统&#xff0c;以自由软件为基础&a…

吴恩达机器学习笔记:第 7 周-12支持向量机(Support Vector Machines)12.4-12.6

目录 第 7 周 12、 支持向量机(Support Vector Machines)12.4 核函数 1 第 7 周 12、 支持向量机(Support Vector Machines) 12.4 核函数 1 回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类 问题&#xff1a; 为了获得上图所示的判定边界&…

电子元器件线上交易商城搭建的价值和必要性-加速度jsudo

随着科技的飞速发展&#xff0c;电子元器件行业正迎来前所未有的变革。为了满足市场对于电子元器件采购的便捷性、高效性和多样性的需求&#xff0c;电子元器件商城的开发显得尤为重要。本文将探讨电子元器件商城开发的重要性、主要功能以及它如何助力行业发展。 电子元器件商城…

【word】文档标题如何自动编号

我在写一个word文档的时候&#xff0c;每一级标题的格式都设置好了&#xff0c;包括字体&#xff0c;大小等等&#xff0c;但是如何自动编号呢&#xff1f; 在写中期报告的时候&#xff0c;我对每一级标题的格式都创建了一个单独的样式&#xff0c;像这样&#xff1a; 对于每一…

Vue3——Tinymce6富文本编辑器的使用方法

TinyMCE 6 是一款功能强大且灵活的富文本编辑器&#xff0c;可以嵌入到 Web 应用程序中。 一、安装 本文的讲解主要以tinymce6 版本为例 官网地址 Migrating from TinyMCE 5 to TinyMCE 6 | TinyMCE Documentation ​ 要将 TinyMCE 添加到项目中&#xff0c;请执行以下操…

Springboot+Vue项目-基于Java+Mysql的网上订餐系统(附源码+LW+演示录像)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Python框架之UnitTest

unittest 是python 的单元测试框架&#xff0c;unittest 单元测试提供了创建测试用例&#xff0c;测试套件以及批量执行的方案&#xff0c; unittest 在安装pyhton 以后就直接自带了&#xff0c;直接import unittest 就可以使用&#xff0c;测试人员用UnitTest来做自动化测试&a…

【CSS】盒子居中

目录 效果图 代码及其解释 补充解释 效果图 同时实现盒子与文字的居中 代码及其解释 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">#box1{width: 500px;height:…

阿斯达年代记三强争霸开服时间+官网地址+预约下载安装教程分享

阿斯达年代记国际服&#xff0c;游戏分为三个势力&#xff0c;分别是阿斯达、亚高和不罚者&#xff0c;每个玩家都必须选择一个势力&#xff0c;而每个势力每周将会诞生一名势力族长&#xff0c;将会从五名候选人中投票产生&#xff0c;想要进入候选人名单&#xff0c;必须每天…

Netty学习——实战篇2 NIO 群聊系统(简单版) 备份

需求&#xff1a; 1、编写一个NIO群聊系统&#xff0c;实现服务端和客户端之间数据简单通讯(非阻塞) 2、实现多人群聊 3、服务端&#xff1a;可以监测用户上线、离线、并实现消息转发功能。 4、客户端&#xff1a;通过channel可以无阻塞发送消息给其他所有用户&#xff0c;同时…

分类算法(数据挖掘)

目录 1. 逻辑回归&#xff08;Logistic Regression&#xff09; 2. 支持向量机&#xff08;Support Vector Machine, SVM&#xff09; 3. 决策树&#xff08;Decision Tree&#xff09; 4. 随机森林&#xff08;Random Forest&#xff09; 5. K近邻&#xff08;K-Nearest …

Vue3(三):生命周期、路由、自定义hooks

这里终于明白了为什么一直有这个语法报错&#xff0c;就是在提示你哪里错的地方上方注释一行/*eslint-disable*/&#xff0c;之前一直警告这个错误感谢老师&#xff01; 一、vue2和vue3生命周期 还有一个问题就是父组件和子组件哪个先挂载完毕呢&#xff1f;答案是子组件先挂…

Qt---控件的基本属性

文章目录 enabled(控件可用状态)geometry(位置和尺寸)简单恶搞程序 windowIcon(顶层 widget 窗口图标)使用 qrc 机制 windowOpacity(窗口的不透明值)cursor(当鼠标悬停空间上的形状)自定义鼠标图标 toolTip(鼠标悬停时的提示)focusPolicy(控件获取焦点的策略)styleSheet(通过CS…

【Python实践应用】使用Python加载栅格数据

下面的代码实现的是加载伊宁市NDVI数据&#xff0c;首先进行相关的python包的导入&#xff0c;然后定义和读取我们需要加载的数据&#xff0c;这里我们使用的NDVI数据是将伊宁23年的NDVI数据合并成为了一张栅格图像&#xff0c;每个波段表示一年的 NDVI&#xff0c;我们这里显示…

MySQL学习笔记3——条件查询和聚合函数

条件查询和聚合函数 一、条件查询语句二、聚合函数1、SUM&#xff08;&#xff09;2、AVG()、MAX()、MIN()3、COUNT&#xff08;&#xff09; 一、条件查询语句 WHERE 和 HAVING 的区别&#xff1a; WHERE是直接对表中的字段进行限定&#xff0c;来筛选结果&#xff1b;HAVIN…

最新版IntelliJ IDEA 2024.1安装和配置教程 详细图文解说版安装教程

IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版 文章目录 IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版前言 第一步&#xff1a; IntelliJ IDEA 2024.1安装教程第 0 步&…

Java快速入门系列-7(测试与调试)

第七章:测试与调试 第7章:测试与调试7.1 单元测试(JUnit)7.1.1 为什么要进行单元测试7.1.2 JUnit基础7.1.3 断言7.1.4 测试套件7.2 集成测试与系统测试7.2.1 集成测试7.2.2 系统测试7.3 调试技巧与工具7.3.1 断点7.3.2 单步执行7.3.3 变量检查7.3.4 条件断点7.3.5 日志记录…

Playwright已经是目前最好的测试自动化工具了吗?

作者观点&#xff1a;很长时间以来&#xff0c;Selenium是QA工程师寻求测试自动化解决方案的首选测试框架。它能够测试任何浏览器&#xff08;这在IE浏览器的统治时期尤其重要&#xff09;和任何平台。然而&#xff0c;现在看来&#xff0c;那个时代已经过去了。 今天&#xf…