当前位置: 首页 > news >正文

打家劫舍问题 Python题解

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。


本文目录

  • 打家劫舍
    • 题目描述
    • 题解
  • 打家劫舍 II
    • 题目描述
    • 题解
  • 打家劫舍 III
    • 题目描述
    • 题解


打家劫舍

题目描述

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 + 1 = 12 。

来源: 198. 打家劫舍 - 力扣 (LeetCode)

题解

动态规划

首先考虑最简单的情况。如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额。如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。

如果房屋数量大于两间,应该如何计算能够偷窃到的最高总金额呢?对于第 k ( k > 2 ) k (k>2) k(k>2) 间房屋,有两个选项:

  1. 偷窃第 k k k 间房屋,那么就不能偷窃第 k − 1 k−1 k1 间房屋,偷窃总金额为前 k − 2 k−2 k2 间房屋的最高总金额与第 k k k 间房屋的金额之和。
  2. 不偷窃第 k k k 间房屋,偷窃总金额为前 k − 1 k−1 k1 间房屋的最高总金额。

在两个选项中选择偷窃总金额较大的选项,该选项对应的偷窃总金额即为前 k k k 间房屋能偷窃到的最高总金额。

d p [ i ] dp[i] dp[i] 表示前 i i i 间房屋能偷窃到的最高总金额,那么就有如下的状态转移方程:

d p [ i ] = m a x ( d p [ i − 2 ] + n u m s [ i ] , d p [ i − 1 ] ) dp[i] = max(dp[i-2] + nums[i], dp[i-1]) dp[i]=max(dp[i2]+nums[i],dp[i1])

边界条件为:

{ d p [ 0 ] = n u m s [ 0 ] 只有一间房屋,则偷窃该房屋 d p [ 1 ] = m a x ( n u m s [ 0 ] , n u m s [ 1 ] ) 只有两间房屋,选择其中金额较高的房屋进行偷窃 \begin{cases} dp[0] = nums[0] & 只有一间房屋,则偷窃该房屋\\ dp[1] = max(nums[0], nums[1]) & 只有两间房屋,选择其中金额较高的房屋进行偷窃 \end{cases} {dp[0]=nums[0]dp[1]=max(nums[0],nums[1])只有一间房屋,则偷窃该房屋只有两间房屋,选择其中金额较高的房屋进行偷窃

最终的答案即为 d p [ n − 1 ] dp[n−1] dp[n1],其中 n n n 是数组的长度。

class Solution:def rob(self, nums: List[int]) -> int:if not nums:return 0size = len(nums)if size == 1:return nums[0]dp = [0] * sizedp[0] = nums[0]dp[1] = max(nums[0], nums[1])for i in range(2, size):dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])return dp[size - 1]

上述方法使用了数组存储结果。考虑到每间房屋的最高总金额只和该房屋的前两间房屋的最高总金额相关,因此可以使用滚动数组,在每个时刻只需要存储前两间房屋的最高总金额。

class Solution:def rob(self, nums: List[int]) -> int:if not nums:return 0size = len(nums)if size == 1:return nums[0]first, second = nums[0], max(nums[0], nums[1])for i in range(2, size):first, second = second, max(first + nums[i], second)return second

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组长度。只需要对数组遍历一次。
  • 空间复杂度: O ( 1 ) O(1) O(1)。使用滚动数组,可以只存储前两间房屋的最高总金额,而不需要存储整个数组的结果,因此空间复杂度是 O ( 1 ) O(1) O(1)

打家劫舍 II

题目描述

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

示例 1:

输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2),因为他们是相邻的。

示例 2:

输入:nums = [1,2,3,1]
输出:4
解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。

示例 3:

输入:nums = [1,2,3]
输出:3

来源: 213. 打家劫舍 II - 力扣 (LeetCode)

题解

动态规划

首先考虑最简单的情况。如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额。如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。

注意到当房屋数量不超过两间时,最多只能偷窃一间房屋,因此不需要考虑首尾相连的问题。如果房屋数量大于两间,就必须考虑首尾相连的问题,第一间房屋和最后一间房屋不能同时偷窃。

如何才能保证第一间房屋和最后一间房屋不同时偷窃呢?如果偷窃了第一间房屋,则不能偷窃最后一间房屋,因此偷窃房屋的范围是第一间房屋到最后第二间房屋;如果偷窃了最后一间房屋,则不能偷窃第一间房屋,因此偷窃房屋的范围是第二间房屋到最后一间房屋。

假设数组 n u m s nums nums 的长度为 n n n。如果不偷窃最后一间房屋,则偷窃房屋的下标范围是 [ 0 , n − 2 ] [0,n−2] [0,n2];如果不偷窃第一间房屋,则偷窃房屋的下标范围是 [ 1 , n − 1 ] [1,n−1] [1,n1]。在确定偷窃房屋的下标范围之后,即可用第 198 题的方法解决。对于两段下标范围分别计算可以偷窃到的最高总金额,其中的最大值即为在 n n n 间房屋中可以偷窃到的最高总金额。

假设偷窃房屋的下标范围是 [ s t a r t , e n d ] [start,end] [start,end],用 d p [ i ] dp[i] dp[i] 表示在下标范围 [ s t a r t , i ] [start,i] [start,i] 内可以偷窃到的最高总金额,那么就有如下的状态转移方程:

d p [ i ] = max ⁡ ( d p [ i − 2 ] + n u m s [ i ] , d p [ i − 1 ] ) dp[i]=\max(dp[i−2]+nums[i],dp[i−1]) dp[i]=max(dp[i2]+nums[i],dp[i1])

边界条件为:

{ d p [ s t a r t ] = n u m s [ s t a r t ] 只有一间房屋,则偷窃该房屋 d p [ s t a r t + 1 ] = max ⁡ ( n u m s [ s t a r t ] , n u m s [ s t a r t + 1 ] ) 只有两间房屋,偷窃其中金额较高的房屋 \begin{cases} dp[start]=nums[start] & 只有一间房屋,则偷窃该房屋 \\ dp[start+1]=\max(nums[start],nums[start+1]) & 只有两间房屋,偷窃其中金额较高的房屋 \end{cases} {dp[start]=nums[start]dp[start+1]=max(nums[start],nums[start+1])只有一间房屋,则偷窃该房屋只有两间房屋,偷窃其中金额较高的房屋

计算得到 d p [ e n d ] dp[end] dp[end] 即为下标范围 [ s t a r t , e n d ] [start,end] [start,end] 内可以偷窃到的最高总金额。

分别取 ( s t a r t , e n d ) = ( 0 , n − 2 ) (start,end)=(0,n−2) (start,end)=(0,n2) ( s t a r t , e n d ) = ( 1 , n − 1 ) (start,end)=(1,n−1) (start,end)=(1,n1) 进行计算,取两个 d p [ e n d ] dp[end] dp[end] 中的最大值,即可得到最终结果。

根据上述思路,可以得到时间复杂度 O ( n ) O(n) O(n) 和空间复杂度 O ( n ) O(n) O(n) 的实现。考虑到每间房屋的最高总金额只和该房屋的前两间房屋的最高总金额相关,因此可以使用滚动数组,在每个时刻只需要存储前两间房屋的最高总金额,将空间复杂度降到 O ( 1 ) O(1) O(1)

class Solution:def rob(self, nums: List[int]) -> int:def robRange(start: int, end: int) -> int:first = nums[start]second = max(nums[start], nums[start + 1])for i in range(start + 2, end + 1):first, second = second, max(first + nums[i], second)return secondlength = len(nums)if length == 1:return nums[0]elif length == 2:return max(nums[0], nums[1])else:return max(robRange(0, length - 2), robRange(1, length - 1))

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组长度。需要对数组遍历两次,计算可以偷窃到的最高总金额。
  • 空间复杂度: O ( 1 ) O(1) O(1)

打家劫舍 III

题目描述

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。

除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。

示例 1:

img

输入: root = [3,2,3,null,3,null,1]
输出: 7 
解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

示例 2:

img

输入: root = [3,4,5,1,3,null,1]
输出: 9
解释: 小偷一晚能够盗取的最高金额 4 + 5 = 9

来源: 337. 打家劫舍 III - 力扣 (LeetCode)

题解

动态规划

简化一下这个问题:一棵二叉树,树上的每个点都有对应的权值,每个点有两种状态(选中和不选中),问在不能同时选中有父子关系的点的情况下,能选中的点的最大权值和是多少。

我们可以用 f ( o ) f(o) f(o) 表示选择 o o o 节点的情况下, o o o 节点的子树上被选择的节点的最大权值和; g ( o ) g(o) g(o) 表示不选择 o o o 节点的情况下, o o o 节点的子树上被选择的节点的最大权值和; l l l r r r 代表 o o o 的左右孩子。

  • o o o 被选中时, o o o 的左右孩子都不能被选中,故 o o o 被选中情况下子树上被选中点的最大权值和为 l l l r r r 不被选中的最大权值和相加,即 f ( o ) = g ( l ) + g ( r ) f(o)=g(l)+g(r) f(o)=g(l)+g(r)
  • o o o 不被选中时, o o o 的左右孩子可以被选中,也可以不被选中。对于 o o o 的某个具体的孩子 x x x,它对 o o o 的贡献是 x x x 被选中和不被选中情况下权值和的较大值。故 g ( o ) = m a x { f ( l ) , g ( l ) } + m a x { f ( r ) , g ( r ) } g(o)=max\{f(l),g(l)\}+max\{f(r),g(r)\} g(o)=max{f(l),g(l)}+max{f(r),g(r)}

至此,我们可以用哈希表来存 f f f g g g 的函数值,用深度优先搜索的办法后序遍历这棵二叉树,我们就可以得到每一个节点的 f f f g g g。根节点的 f f f g g g 的最大值就是我们要找的答案。

我们不难给出这样的实现:

class Solution:def rob(self, root: Optional[TreeNode]) -> int:f = {None:0}g = {None:0}def dfs(node):if not node:returndfs(node.left)dfs(node.right)f[node] = node.val + g[node.left] + g[node.right]g[node] = max(f[node.left], g[node.left]) + max(f[node.right], g[node.right])dfs(root)return max(f[root], g[root])

假设二叉树的节点个数为 n n n

我们可以看出,以上的算法对二叉树做了一次后序遍历,时间复杂度是 O ( n ) O(n) O(n);由于递归会使用到栈空间,空间代价是 O ( n ) O(n) O(n),哈希表的空间代价也是 O ( n ) O(n) O(n),故空间复杂度也是 O ( n ) O(n) O(n)

我们可以做一个小小的优化,我们发现无论是 f ( o ) f(o) f(o) 还是 g ( o ) g(o) g(o),他们最终的值只和 f ( l ) f(l) f(l) g ( l ) g(l) g(l) f ( r ) f(r) f(r) g ( r ) g(r) g(r) 有关,所以对于每个节点,我们只关心它的孩子节点们的 f f f g g g 是多少。我们可以设计一个结构,表示某个节点的 f f f g g g 值,在每次递归返回的时候,都把这个点对应的 f f f g g g 返回给上一级调用,这样可以省去哈希表的空间。

代码如下:

class Solution:def rob(self, root: Optional[TreeNode]) -> int:def dfs(node):if not node:return (0, 0)l = dfs(node.left)r = dfs(node.right)selected = node.val + l[1] + r[1]notSelected = max(l) + max(r)return selected, notSelectedans = dfs(root)return max(ans)

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n)。上文中已分析。
  • 空间复杂度: O ( n ) O(n) O(n)。虽然优化过的版本省去了哈希表的空间,但是栈空间的使用代价依旧是 O ( n ) O(n) O(n),故空间复杂度不变。

相关文章:

打家劫舍问题 Python题解

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...

【JavaSE】Java基础语法(十八):接口

文章目录 1. 接口的概述2. 接口的特点3. 接口的成员特点4. 类和接口的关系5. 抽象类和接口的关系 1. 接口的概述 接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。Java中接口存在的两个意义 用来定义规范用来做功能的拓展 2. 接口的特点…...

SVD求解两组多维点之间的欧式变换矩阵,及halcon代码实现

之前研究了二维点的仿射变换,用解矩阵的方式求解了两组二维点之间的变换矩阵。 学习了下SVD,看到可以用SVD求解两组多维点之间的欧式变换矩阵,当然也是个最优化问题。 这里的变换只有平移和旋转,没有缩放。 一、先说结论&#…...

常用监控方案 Prometheus + Grafana 简单使用小结

文章目录 前言一、概念1.1 发展1.2 时序数据1.3 Metric 二、Prometheus2.1 架构2.2 配置2.3 查询语言PromQL2.4 Exporter 三、Grafana3.1 数据源3.2 权限3.3 面板可视化3.4 仪表盘 四、实战4.1 监控 Windows/Linux4.2 监控 JVM4.3 监控 MySQL4.4 监控 Springboot API 参考 前言…...

基于长短期神经网络LSTM的飞行轨迹跟踪预测,基于长短期神经网络LSTM的三维路径预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的飞行轨迹跟踪 完整代码: https://download.csdn.net/download/abc991835105/87705046 效果图 结果分析 展望 参考论文 背影 路径追踪预测,对实现自动飞行驾驶拥有重要意义,长短期神经网络是一种改进…...

计算机组成原理-指令系统-指令格式及寻址方式

目录 一、指令的定义 1.1 扩展操作码指令格式 二、指令寻址方式 2.1 顺序寻址 2.2 跳跃寻址 三、 数据寻址 3.1 直接寻址 3.2 间接寻址 3.3 寄存器寻址 ​ 3.4 寄存器间接寻址 3.5 隐含寻址 3.6 立即寻址 3.7 偏移地址 3.7.1 基址寻址 3.7.2 变址寻址 3.7.3 相对寻址…...

【满分】【华为OD机试真题2023B卷 JAVAJS】经典屏保

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 经典屏保 知识点循环迭代编程基础 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: DVD机在视频输出时,为了保护电视显像管,在待机状态会显示“屏保动画”,如下图所示,DVD Logo在屏幕内来回运动,碰到边缘会反弹…...

Apache 网页与安全优化

目录 一:Apache网页优化概述 1、概述 2、优化内容 3、gzip介绍 4、Apache的压缩模块 5、mod_ gzip 模块与mod_ deflate 模块 二: 网页压缩 1.检查是否安装 mod_deflate 模块 2. 如果没有安装mod_deflate 模块,重新编译安装 Apache 添…...

Unity的IFilterBuildAssemblies:深入解析与实用案例

Unity IFilterBuildAssemblies Unity IFilterBuildAssemblies是Unity引擎中的一个非常有用的功能,它可以让开发者在构建项目时自定义哪些程序集需要被包含在构建中,哪些程序集需要被排除在建之外。这个功能可以帮助开发者更好地控制项目的构建过程&…...

分片架构,Redis Cluster 分析

分片架构解决的问题 通过堆机器,提升读写性能,与存储性能 分片架构设计要点 分片规则 选择Cardinality大的作为分片键,尽可能保证数据分布均匀 常见分片键: 基于主键(业务型数据),基于时间…...

Linux-0.11 文件系统bitmap.c详解

Linux-0.11 文件系统bitmap.c详解 模块简介 该模块包含了两对函数,第一对是和i节点相关的free_inode()和new_inode()。第二对是和逻辑块相关的free_block()和new_block()。 函数详解 free_block void free_block(int dev, int block)该函数的作用是释放设备dev…...

【Linux】基本指令,拥抱Linux的第一步

[Linux]常见指令 Linux基本指令指令的本质ls指令pwd指令cd指令touch指令mkdir指令(重要)rmdir&&rm指令(重要)man指令(重要)cp指令(重要)mv指令(重要)重定向cat指令more指令less指令(重要…...

CTF 2015: Search Engine-fastbin_dup_into_stack

参考: [1]https://gsgx.me/posts/9447-ctf-2015-search-engine-writeup/ [2]https://blog.csdn.net/weixin_38419913/article/details/103238963(掌握利用点,省略各种逆向细节) [3]https://bbs.kanxue.com/thread-267876.htm(逆向调试详解&am…...

DRF之全局异常处理

一、REST framework 提供了异常处理,我们可以自定义异常处理函数 使用方式: from rest_framewoork.views import exception_handerdef custom_exception_handler(exc,context):# 先调用REST framework默认的异常处理方法获得标准错误响应对象response …...

AI创作工具的使用体验报告

下面是AI创作工具的使用体验报告,围绕以下三点展开: 一、工具的使用体验如何? CSDN博客AI创作工具是一款非常易用的工具,操作简单,可以很快地开始创建内容。在使用过程中,我发现它的语言模型很智能&#…...

C++算法模板(转自acwing)

快速排序算法模板 —— 模板题 AcWing 785. 快速排序 void quick_sort(int q[], int l, int r) {if (l > r) return;int i l - 1, j r 1, x q[l r >> 1];while (i < j){do i ; while (q[i] < x);do j -- ; while (q[j] > x);if (i < j) swap(q[i],…...

阿里云服务器最新优惠价格及最新收费标准(2023更新)

阿里云服务器收费标准分为包年包月和按量付费两种模式&#xff0c;包年包月是一种先付费后使用的计费方式&#xff0c;按量付费是一种先使用后付费的计费方式。选择包年包月的收费模式&#xff0c;用户可以提前预留资源&#xff0c;同时享受更大的价格优惠&#xff0c;帮您更大…...

React实现监听粘贴事件并获取粘贴板中的截图

目录 监听粘贴事件并获取粘贴板中的截图 TSX中给组件添加监听粘贴事件从粘贴板获取截图文件React监听事件 事件监听绑定的事件函数相关扩展 监听粘贴事件并获取粘贴板中的截图 TSX中给组件添加监听粘贴事件 ? 1 2 3 4 5 6 7 8 9 10 11 const pasteImageRef useRef<HTML…...

ISO_IEC_7816-3

介绍 ISO/IEC 7816 是一系列标准&#xff0c;规定了集成电路卡和此类卡的使用 互换。 这些卡是用于在外部世界和卡中的集成电路之间协商的信息交换的识别卡。 作为信息交换的结果&#xff0c;卡传递信息&#xff08;计算结果、存储的数据&#xff09;和/或修改其内容&#xff0…...

学习C#反射(Reflection)

反射提供描述程序集、模块和类型的对象&#xff08;Type 类型&#xff09;。 可以使用反射动态地创建类型的实例&#xff0c;将类型绑定到现有对象&#xff0c;或从现有对象中获取类型&#xff0c;然后调用其方法或访问器字段和属性。 如果代码中使用了特性(Attribute)&#xf…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...