【Python LeetCode】面试经典 150 题
- 数组 / 字符串
- 快慢指针(双指针)总结
- 88. 合并两个有序数组
- 27. 移除元素
- 26. 删除有序数组中的重复项
- 80. 删除有序数组中的重复项 II
- `Boyer-Moore` 投票算法
- 169. 多数元素
- 扩展:寻找 n/3 多数元素
- 翻转法
- 189. 轮转数组
- 贪心
- 121. 买卖股票的最佳时机
- 122. 买卖股票的最佳时机 II
- 55. 跳跃游戏
- 45. 跳跃游戏 II
- 274. H 指数
- 前缀 / 后缀
- 238. 除自身以外数组的乘积
- 134. 加油站
- 双指针
- 125. 验证回文串
- 滑动窗口
- 矩阵
- 哈希表
- 380. O(1) 时间插入、删除和获取随机元素
- 二叉树
- 104. 二叉树的最大深度
- 100. 相同的树
- 226. 翻转二叉树
- 分治
- 回溯
数组 / 字符串
快慢指针(双指针)总结
“快慢指针” 主要用于 数组的原地修改问题,避免额外空间开销,同时保证 O(n)
线性时间复杂度。
题目 | 题目要求 | 快指针 i | 慢指针 p |
---|---|---|---|
合并两个有序数组 | nums1 和 nums2 归并排序 | 遍历 nums1 & nums2 ,从后向前合并 | 指向 nums1 末尾,填充较大值 |
移除元素 | nums 中移除 val ,保持相对顺序 | 遍历 nums ,查找非 val 元素 | 记录下一个非 val 元素存放位置 |
删除有序数组中的重复项 | 只保留 1个,相对顺序不变 | 遍历 nums ,查找不同的元素 | 记录下一个唯一元素存放位置 |
删除有序数组中的重复项 II | 只保留 最多 2 个 | 遍历 nums ,查找满足出现≤2次的元素 | 记录下一个可存放元素的位置 |
快慢指针的核心思路:
- 遍历数组(快指针
i
负责遍历数组) - 找到符合条件的元素(如不同于前一个元素、出现次数不超过 2 次等)
- 将其存放到正确的位置(
p
负责记录符合条件的元素存放位置) - 最终
p
代表新的数组长度
88. 合并两个有序数组
下面两行代码就可以解决,
nums1[m:] = nums2 # 把 nums2 拼接到 nums1 从下标 m 开始后面
nums1.sort() # 默认升序排序
不过还是规规矩矩用双指针法写一下吧,
class Solution:def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:"""Do not return anything, modify nums1 in-place instead."""# 指针分别指向 nums1 和 nums2 的最后一个有效元素p1, p2 = m - 1, n - 1# 指针 p 指向合并后数组的最后一个位置p = m + n - 1# 从后往前合并while p1 >= 0 and p2 >= 0:if nums1[p1] > nums2[p2]:nums1[p] = nums1[p1]p1 -= 1else:nums1[p] = nums2[p2]p2 -= 1p -= 1# 如果 nums2 还有剩余元素,填充到 nums1while p2 >= 0:nums1[p] = nums2[p2]p2 -= 1p -= 1
27. 移除元素
class Solution:def removeElement(self, nums: List[int], val: int) -> int:# 维护一个慢指针 k 指向下一个存放非 val 元素的位置k = 0 # 遍历数组for num in nums:if num != val: # 只有当元素不等于 val 时,才放入 nums[k] 位置nums[k] = numk += 1 # k 向前移动return k # 返回新的数组长度
26. 删除有序数组中的重复项
class Solution:def removeDuplicates(self, nums: List[int]) -> int:# 慢指针 k 记录下一个存放唯一元素的位置k = 1 # 遍历数组for i in range(1, len(nums)):if nums[i] != nums[i - 1]: # 只有当当前元素不等于前一个元素时才存入nums[k] = nums[i]k += 1 # 移动慢指针return k # 返回唯一元素的个数
80. 删除有序数组中的重复项 II
class Solution:def removeDuplicates(self, nums: List[int]) -> int:"""Do not return anything, modify nums in-place instead."""if len(nums) <= 2:return len(nums) # 数组长度小于等于2时,直接返回# 指针 p 记录下一个存放元素的位置p = 2for i in range(2, len(nums)):if nums[i] != nums[p - 2]: # 只有当 nums[i] ≠ nums[p-2] 时,才可以保留nums[p] = nums[i]p += 1 # 递增存放位置return p # p 就是去重后的数组长度
Boyer-Moore
投票算法
Boyer-Moore 投票算法(Boyer-Moore Voting Algorithm) 是一种用于在 数组中寻找出现次数超过 ⌊n/2⌋
的元素(即 多数元素)的高效算法。
该算法的 时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1),只需要一次遍历和常数级额外空间,非常高效。
- 若一个元素出现超过
n/2
次,它的 票数净增量一定是正的。- 其他元素的 抵消票数永远无法超过多数元素的总数。
- 这样,多数元素的 最终
count
绝对不会归零,即使在过程中count
可能降为零,换新的candidate
后,最终的candidate
仍然是多数元素。
169. 多数元素
可以使用 Boyer-Moore
投票算法 来 高效找出多数元素。该算法的时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。
- 核心思想:抵消计数,如果某个元素是多数元素(出现次数
> ⌊n/2⌋
),那么它最终一定会成为 唯一剩下的候选人。 - 计数规则:遇到相同的元素,
count +1
;遇到不同的元素,count -1
。当count == 0
时,换一个候选人。
由于 多数元素的出现次数超过 ⌊n/2⌋
,即使被其他元素抵消,也最终会留在 candidate
里。
class Solution:def majorityElement(self, nums: List[int]) -> int:"""Boyer-Moore 投票算法"""candidate = None # 维护一个 候选元素count = 0 # 计数器for num in nums:if count == 0:candidate = num # 选择新的候选多数元素count += (1 if num == candidate else -1) # 增加票数 或 抵消票数return candidate # 因为题目说多数元素一定存在,最终 candidate 即为结果
扩展:寻找 n/3 多数元素
如果需要找 出现次数超过 n/3 的元素,则可以维护 两个候选人 和 两个计数器:
class Solution:def majorityElement(self, nums: List[int]) -> List[int]:candidate1, candidate2, count1, count2 = None, None, 0, 0for num in nums:if count1 == 0:candidate1, count1 = num, 1elif count2 == 0:candidate2, count2 = num, 1elif num == candidate1: # 投票给候选人 1count1 += 1elif num == candidate2: # 投票给候选人 2count2 += 1else: # 没有投票给两个候选人中的任何一人count1 -= 1count2 -= 1# 第二遍遍历,检查候选人是否真的超过 n/3return [c for c in (candidate1, candidate2) if nums.count(c) > len(nums) // 3]
翻转法
翻转法中,交换变量使用 a, b = b, a
,本质上是 元组打包(tuple packing)+ 元组解包(tuple unpacking),它的底层实现依赖于:栈操作+引用变更,不会创建新的对象,只是 交换变量指向的内存地址。
ROT_TWO
是 Python 字节码中的一个栈操作指令,用于 交换栈顶的两个元素。case ROT_TWO: {PyObject *top = STACK_POP(); // 取出栈顶元素(指针引用)PyObject *second = STACK_POP(); // 取出次栈顶元素(指针引用)STACK_PUSH(top); // 先压入原来的栈顶STACK_PUSH(second); // 再压入原来的次栈顶DISPATCH(); }
PyObject *top
和PyObject *second
只是指向原来 Python 对象的指针,并没有创建新的对象。STACK_POP()
只是修改了栈指针,而不是拷贝对象。STACK_PUSH()
只是把相同的指针重新放回去,没有额外的内存分配。
因此,交换是 “原地” 进行的,不涉及对象复制或新分配。
189. 轮转数组
翻转法 利用 三次反转 完成 原地修改,时间 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1),高效且简洁。
class Solution:def rotate(self, nums: List[int], k: int) -> None:"""Do not return anything, modify nums in-place instead."""n = len(nums)k = k % n # 防止 k 大于 n,取模优化# 定义反转函数def reverse(start: int, end: int):while start < end:nums[start], nums[end] = nums[end], nums[start]start += 1end -= 1reverse(0, n - 1) # 反转整个数组reverse(0, k - 1) # 反转前 k 个元素reverse(k, n - 1) # 反转后 n-k 个元素
贪心
121. 买卖股票的最佳时机
先考虑最简单的 暴力遍历,即枚举出所有情况,并从中选择最大利润。时间复杂度为 O ( N 2 ) O(N^2) O(N2) 。考虑到题目给定的长度范围 1≤prices.length≤10^5
,需要思考更优解法。
- 由于卖出肯定在买入后,所以 从前往后遍历维护一个最小价格
min_price
,肯定是碰到越小价格更有可能利润更大。 - 由于要求最大利润,所以 维护一个最大利润
max_profit
,当天的利润就是当天的价格减去遇到的最低价price - min_price
,遇到更高利润就更新。
class Solution:def maxProfit(self, prices: List[int]) -> int:min_price, max_profit = float('+inf'), 0 # 最低价格,最高利润for price in prices:min_price = min(min_price, price) # 更新最低价格max_profit = max(max_profit, price - min_price) # 更新最高利润return max_profit
122. 买卖股票的最佳时机 II
基本思路:所有上涨交易日都买卖(赚到所有利润),所有下降交易日都不买卖(绝不亏钱)。
class Solution:def maxProfit(self, prices: List[int]) -> int:max_profit = 0for i in range(1, len(prices)):if prices[i] - prices[i-1] > 0:max_profit += prices[i] - prices[i-1] # 累积 盈利return max_profit
55. 跳跃游戏
思路:尽可能到达最远位置。如果能到达某个位置,那一定能到达它前面的所有位置。
class Solution:def canJump(self, nums: List[int]) -> bool:n = len(nums)max_index = 0 # 记录最远可跳跃的位置for i in range(n):if i > max_index: # 无法到达 i 位置就无法到达最后下标return Falsemax_index = max(max_index, nums[i] + i) # 更新最远位置if max_index >= n-1:return True
45. 跳跃游戏 II
- 贪心策略:每次选择能跳得最远的位置,从而尽可能减少跳跃的次数。
- 维护当前跳跃区间:在每一步,会有一个“当前区间”,它表示 从当前跳跃开始,能够到达的最远位置。在区间内,更新最远可以跳到的位置。
- 跳跃次数:每次更新最远的位置后,意味着完成了一次跳跃,需要跳到下一个区间。
class Solution:def jump(self, nums: List[int]) -> int:jumps = 0 # 跳跃次数current_end = 0 # 当前跳跃区间的右端farthest = 0 # 能跳到的最远位置# 遍历数组,跳跃的次数for i in range(len(nums) - 1): # 不需要遍历最后一个位置farthest = max(farthest, i + nums[i]) # 更新最远可以到达的位置# 如果当前已经到达了当前跳跃区间的右端if i == current_end:jumps += 1 # 需要跳跃一次current_end = farthest # 更新跳跃区间的右端# 如果当前跳跃区间的右端已经超过了最后一个位置,直接返回跳跃次数if current_end >= len(nums) - 1:return jumpsreturn jumps
274. H 指数
- 排序:首先将
citations
数组按 从大到小排序。 - 遍历排序后的数组:从第一个元素开始,检查每个元素是否满足条件
citations[i] >= i + 1
,其中i + 1
是当前论文的排名。 - 最大
h
值:最终,最大的i + 1
使得citations[i] >= i + 1
即为h
指数。
class Solution:def hIndex(self, citations: List[int]) -> int:citations.sort(reverse=True) # 对引用次数进行降序排序# 遍历已排序的 citations 数组,找到最大 h 指数for i in range(len(citations)):if citations[i] < i + 1: # 论文 i + 1 应该有 citations[i] 次引用return i # 返回 h 指数return len(citations) # 如果所有的论文的引用次数都满足,返回数组长度
前缀 / 后缀
238. 除自身以外数组的乘积
可以分两步来完成这个任务:
-
前缀积:首先计算每个位置的前缀积,即从数组的最左侧到当前位置之前所有元素的乘积。这可以通过一个临时数组
answer
来实现,其中answer[i]
表示nums[0]
到nums[i-1]
的乘积。 -
后缀积:然后计算每个位置的后缀积,即从数组的最右侧到当前位置之后所有元素的乘积。这可以通过另一个临时变量
right
来实现,直接从右到左更新answer
数组。
class Solution:def productExceptSelf(self, nums: List[int]) -> List[int]:n = len(nums)# 初始化答案数组answer = [1] * n# 计算前缀积,存入 answer 数组left_product = 1for i in range(n):answer[i] = left_productleft_product *= nums[i]# 计算后缀积,直接更新 answer 数组right_product = 1for i in range(n-1, -1, -1):answer[i] *= right_productright_product *= nums[i]return answer
134. 加油站
双指针
125. 验证回文串
c.lower()
将字符c
转换为小写。c.isalnum()
判断字符c
是否是字母或数字。如果是字母或数字,就保留该字符;否则跳过。- 通过 字符串的切片操作
[::-1]
获取字符串filtered_s
的反转版本。
class Solution:def isPalindrome(self, s: str) -> bool:# 只保留字母和数字,并转换为小写filtered_s = ''.join(c.lower() for c in s if c.isalnum())# 比较正着读和反着读是否相同return filtered_s == filtered_s[::-1]
双指针:利用 两个指针从字符串的两端开始同时向中间移动,检查字符是否相等,同时跳过所有非字母和数字的字符。
class Solution:def isPalindrome(self, s: str) -> bool:# 初始化左右指针left, right = 0, len(s) - 1while left < right:# 跳过非字母数字字符while left < right and not s[left].isalnum():left += 1while left < right and not s[right].isalnum():right -= 1# 比较字符,忽略大小写if s[left].lower() != s[right].lower():return False# 移动指针left += 1right -= 1return True
滑动窗口
矩阵
哈希表
380. O(1) 时间插入、删除和获取随机元素
基本思路是结合使用 **哈希表(字典)**和 列表(数组)。
- 插入操作
insert(val)
:- 用一个哈希表(
val -> index
)来 记录每个元素的值及其在列表中的位置。这样查找和删除元素时都能在 O ( 1 ) O(1) O(1) 时间内完成。 - 列表
list
用来存储元素,以便可以 快速地随机获取一个元素。
- 用一个哈希表(
- 删除操作
remove(val)
:- 需要从列表中删除一个元素,并且保证其他元素的顺序尽量不被破坏,同时保持 O ( 1 ) O(1) O(1) 的时间复杂度。
- 可以通过 将要删除的元素与列表中的最后一个元素交换位置,然后从哈希表中删除该元素。这样删除操作的时间复杂度是 O ( 1 ) O(1) O(1)。
- 随机获取操作
getRandom()
:利用 列表的下标来随机访问元素,时间复杂度是 O ( 1 ) O(1) O(1)。
import randomclass RandomizedSet:def __init__(self):# 哈希表存储值及其索引,列表存储值self.val_to_index = {}self.list = []def insert(self, val: int) -> bool:if val in self.val_to_index:return False # 如果已经存在,返回 False# 插入操作:将元素添加到列表末尾,并在哈希表中记录该值和索引self.val_to_index[val] = len(self.list)self.list.append(val)return Truedef remove(self, val: int) -> bool:if val not in self.val_to_index:return False # 如果元素不存在,返回 False# 找到元素的索引index = self.val_to_index[val]# 将要删除的元素与最后一个元素交换位置last_element = self.list[-1]self.list[index] = last_elementself.val_to_index[last_element] = index# 删除该元素self.list.pop()del self.val_to_index[val]return Truedef getRandom(self) -> int:return random.choice(self.list) # 随机返回列表中的一个元素# Your RandomizedSet object will be instantiated and called as such:
# obj = RandomizedSet()
# param_1 = obj.insert(val)
# param_2 = obj.remove(val)
# param_3 = obj.getRandom()
二叉树
104. 二叉树的最大深度
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:def maxDepth(self, root: Optional[TreeNode]) -> int:# 如果当前节点为空,返回深度 0if not root:return 0# 递归计算左子树和右子树的最大深度left_depth = self.maxDepth(root.left)right_depth = self.maxDepth(root.right)# 当前节点的深度是左右子树深度的最大值 + 1return max(left_depth, right_depth) + 1
100. 相同的树
class Solution:def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:if not p and not q: # 两棵树都为空return Trueelif not p or not q: # 只有一棵树为空return Falseif p.val != q.val: # 两棵树都不空但节点值不同return False# 两棵树都不空且节点值相同,递归比较return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
226. 翻转二叉树
分治
回溯
相关文章:
【Python LeetCode】面试经典 150 题
数组 / 字符串快慢指针(双指针)总结88. 合并两个有序数组27. 移除元素26. 删除有序数组中的重复项80. 删除有序数组中的重复项 II Boyer-Moore 投票算法169. 多数元素扩展:寻找 n/3 多数元素 翻转法189. 轮转数组 贪心121. 买卖股票的最佳时机…...
营养助力:进行性核上性麻痹患者的饮食管理
进行性核上性麻痹是一种复杂的神经系统退行性疾病,科学的饮食管理不仅能够改善患者的营养状况,还能为神经系统提供必要的支持,延缓病情进展。 这种疾病会导致吞咽困难、营养吸收障碍等问题,增加营养不良的风险。针对性的饮食调理能…...
spineNET模型详解及代码复现
模型背景 在SpineNet模型诞生之前,多尺度特征融合已成为计算机视觉领域的研究热点。研究者们提出了各种方法来处理不同尺度的特征,如 特征金字塔网络(FPN) 和 深度可分离卷积 。然而,这些方法在跨尺度特征融合方面仍存在局限性。 FPN通过自上而下的路径融合不同尺度的特…...
【Mybatis】如何简单使用mybatis-plus,以及MybatisGenerator自动生成或者实现SQL语句
前言 🌟🌟本期讲解关于mybatis中SQL自动生成的相关知识介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆…...
ds-国内主要显卡
国产显卡 寒武纪思元系列 思元 370:采用 7nm 制程工艺及 chiplet 技术,集成 390 亿个晶体管,最大算力高达 256TOPS(INT8)。是国内第一款公开发布支持 LPDDR5 内存的云端 AI 芯片,内存带宽是上一代产品的 3 …...
类和对象——const修饰的类的对象和函数
const修饰的类的对象和函数 const成员函数和const对象1 const成员函数2 调用关系3 const在成员函数中的位置4 取地址&及const取地址操作符重载 const成员函数和const对象 1 const成员函数 将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数&…...
防火墙的智能选路与NAT实验
实验拓扑 配置IP 防火墙的安全区域划分 销售部和运维部不能互相访问,采取vlan的方式来进行隔离。 在配置vlan之后 ,两个部门将不会通信。 以上是基础配置,只是演示在各个部门不通的情况下,使用什么技术来进行隔离网络,…...
ARM学习(43)armcc HardFault函数链接不到的问题理解
armcc HardFault函数链接不到的问题理解 1、问题背景: 笔者汇编语言编写了一个HardFault异常处理函数,HardFault函数属于芯片架构异常处理函数,没有显著的调用(中断向量表中有该函数地址),且启动函数里面也…...
php序列化与反序列化
文章目录 基础知识魔术方法:在序列化和反序列化过程中自动调用的方法什么是 __destruct() 方法?何时触发 __destruct() 方法?用途:语法示例: 反序列化漏洞利用前提条件一些绕过策略绕过__wakeup函数绕过正则匹配绕过相…...
【STL】7.STL常用算法(2)
STL常用算法(2) 前言简介四.常用拷贝和替换算法1.copy2.replace3.replace_if4.swap 五.算术生成算法1.accumulate2.fill 六.常用集合算法1.set_intersection2.set_union3.set_difference 总结 前言 stl系列主要讲述有关stl的文章,使用STL可以…...
怎么获取免费的 GPU 资源完成大语言模型(LLM)实验
怎么获取免费的 GPU 资源完成大语言模型(LLM)实验 目录 怎么获取免费的 GPU 资源完成大语言模型(LLM)实验在线平台类Google ColabKaggle NotebooksHugging Face Spaces百度飞桨 AI Studio在线平台类 Google Colab 特点:由 Google 提供的基于云端的 Jupyter 笔记本环境,提…...
xr-frame 3D Marker识别,扬州古牌坊 3D识别技术稳定调研
目录 识别物体规范 3D Marker 识别目标文件 map 生成 生成任务状态解析 服务耗时: 对传入的视频有如下要求: 对传入的视频建议: 识别物体规范 为提高Marker质量,保证算法识别效果,可参考Marker规范文档 Marker规…...
盛京开源社区加入 GitCode,书写东北开源生态新篇章
在数字化转型与开源技术蓬勃发展的浪潮下,开源社区已成为推动技术创新的核心力量。盛京开源社区(SJOSC)作为沈阳地区的开源交流平台,始终致力于连接开发者、企业及高校,构建区域技术生态圈。 现在,盛京开源…...
【六祎 - Note】SQL备忘录;DDL,DML,DQL,DCL
SQL备忘录 from to : 点击访问源地址...
几个api
几个api 原型链 可以阅读此文 Function instanceof Object // true Object instanceof Function // true Object.prototype.isPrototypeOf(Function) // true Function.prototype.isPrototypeOf(Object) // true Object.__proto__ Function.prototype // true Function.pro…...
(转)Java单例模式(1)
l单例模式的好多:节约了内存,提高了代码的执行效率。...
return和print
目录 1.print的用法 2.return的用法 3. print 和 return 的区别 4.总结 1.print的用法 print 是一个函数,用于将信息输出到控制台(终端)。它主要用于显示程序运行的结果,方便用户查看。print 的作用是输出内容,而不…...
设计模式——过滤器模式在 Spring 中的实践
设计模式——过滤器模式在 Spring 中的实践 基础介绍模块介绍简单实现业务落地额外问题 基础介绍 过滤器模式(Filter Pattern),也称为标准模式(Criteria Pattern),是结构型设计模式之一,旨在通…...
15.7 LangChain 版智能销售顾问实战:构建企业级知识驱动型对话系统
LangChain 版智能销售顾问实战:构建企业级知识驱动型对话系统 关键词:LangChain 销售系统、知识图谱集成、对话状态管理、生产级部署、多链协同优化 1. LangChain 销售系统架构设计 1.1 模块化架构全景图 #mermaid-svg-42MLuD3aMcpX0y8c {font-family:"trebuchet ms&q…...
QT异步编程之线程池QThreadPool
一、概述 在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建线程并销毁线程的过程势必会消耗内存。QThreadPool是Qt框架中用于管理线程池的类。它提供了一种高效的方式来管理和重用线程,从而…...
HTMLS基本结构及标签
HTML5是目前制作网页的核心技术,有叫超文本标记语言。 基本结构 声明部分位于文档的最前面,用于向浏览器说明当前文档使用HTML标准规范。 根部标签位于声明部分后,用于告知浏览器这是一个HTML文档。< html>表示文档开始,&l…...
linux(2)用户管理
文章目录 1. 切换用户2. 添加删除用户3.写改密码 1. 切换用户 # 切换用户名,不切换工作目录 su 用户名 # 一起切换工作目录 su - 用户名 # 退出用户 exit2. 添加删除用户 # 添加用户 sudo adduser username # 推荐sudo useradd -m -s /bin/bash 用户名-m 如果创建…...
蓝桥杯好题推荐----高精度乘法
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 题目链接 P1303 A*B Problem - 洛谷https://www.luogu.com.cn/problem/P1303 解题思路 这道题的思路,其实和前面差不多,我们主要说一下最为关键的部分&…...
辛格迪客户案例 | 甫康(上海)健康科技有限责任公司药物警戒管理系统(PVS)项目
01 案例企业 甫康(上海)健康科技有限责任公司(简称“甫康”)该公司成立于2015年11月3日。公司的核心团队由来自中国和国外顶级制药公司的专业人士组成,与中国科学院上海药物研究所等知名研究机构保持紧密合作。此外,甫康药业还与…...
【Java】System 类
目录 静态字段标准输入输出流相关 常用静态方法数组操作时间操作系统操作属性操作安全管理 其他方法 System 类位于 java.lang 包下,是一个 final 类,意味着它不能被继承。并且其所有构造方法都是私有的,这使得我们无法创建 System 类的实例&…...
认识苹果APP开发框架
苹果APP开发框架是苹果公司为开发者提供的一套工具和API,旨在帮助开发者高效、安全地构建高质量的iOS、macOS、watchOS和tvOS应用程序。以下是对苹果APP开发框架的详细认识: 1. 框架的定义与作用 框架(Framework)是包含方法资源…...
SQL分组问题
下列为电商公司用户访问时间数据 统计某个用户连续的访问记录,如果时间间隔小于60s,就分为一组 id ts 1001 17523641234 1001 17523641256 1002 17523641278 1001 17523641334 1002 17523641434 1001 17523641534 1001 17523641544 1002 17523…...
笔记20250225
关于上拉电阻和下拉电阻的作用 原理 上拉电阻:在上拉电阻所连接的导线上,如果外部组件未启用,上拉电阻则“微弱地”将输入电压信号“拉高”。当外部组件未连接时,对输入端来说,外部“看上去”就是高阻抗的,…...
千峰React:案例一
做这个案例捏 因为需要用到样式,所以创建一个样式文件: //29_实战.module.css .active{text-decoration:line-through } 然后创建jsx文件,修改main文件:导入Todos,写入Todos组件 import { StrictMode } from react …...
说说JVM的底层原理(JAVA是如何运行的)?
JVM 底层原理深度解析 Java 虚拟机(JVM)是 Java 程序运行的核心环境,其设计融合了内存管理、类加载、垃圾回收和高效执行等复杂机制。以下从底层视角详细解析其核心模块,并结合实际场景说明其工作原理。 一、类加载机制 1. 类加…...
IO 和 NIO 有什么区别?
文章目录 阻塞模式与非阻塞模式数据处理方式通信模型应用场景 阻塞模式与非阻塞模式 IO:是阻塞式的 IO 操作。在传统的 IO 中,当一个线程执行读操作或者写操作时,该线程会被阻塞,直到操作完成。例如,在从文件读取数据…...
JVM 面试
JVM 运行时内存区域划分是怎样的? 程序计数器:记录当前线程执行的字节码指令的地址,是线程私有的。 Java 虚拟机栈:每个方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息&#…...
七、Redis集群高可用
一、节点与插槽管理 添加主节点 准备节点 首先准备一个新的节点,添加配置文件。 vi /usr/local/redis/cluster/conf/redis-6377.conf # 放行访问IP限制 bind 0.0.0.0 # 端口 port 6377 # 后台启动 daemonize yes # 日志存储目录及日志文件名 logfile "/us…...
WPF12-MVVM
目录 1. 什么是MVVM2. 实现简单MVVM2.1. Part 12.2. Part 21. 什么是MVVM MVVM 是 Model-View-ViewModel 的缩写,是一种用于构建用户界面的设计模式,是一种简化用户界面的事件驱动编程方式。 MVVM 的目标是实现用户界面和业务逻辑之间的彻底分离,以便更好地管理和维护应用…...
多智能体博弈代码案例
多智能体博弈代码案例 直接可用,我不吝啬 from openai import OpenAI import random# 定义不同人物角色的提示 CHARACTER_PROMPTS = {"专家": "你是该领域的权威专家,知识渊博,回答严谨专业。"...
【AHK】资源管理器自动化办公实例/自动连点设置
此处为一个自动连续点击打开检查的自动化操作案例,没有quicker的鼠键录制,不常用了,做个备份 #MaxThreadsPerHotkey 2 ; 这个是核心!!!!确保可以同时运行多个热键或标签global isRunning : tru…...
Python安装环境变量
1、确保已经安装python到电脑上 2、到系统上环境变量位置 3、新建 系统变量,变量名为PYTHON_HOME,变量值为python安装目录 4、 点击系统变量的path,并新建环境变量 5、测试 ,windowsR,并输入cmd,尝试命令python --ver…...
Flink同步数据mysql到doris问题合集
Flink同步数据mysql到doris 官方同步流程Doris安装下载地址导入镜像启动配置 Flink-cdc安装(自制)下载地址导入镜像启动命令 启动问题修复Flink报错Could not acquire the minimum required resources.作业报错 Mysql8.0 Public Key Retrieval is not al…...
Pytest测试用例执行跳过的3种方式
文章目录 1.前言2.使用 pytest.mark.skip 标记无条件跳过3.使用 pytest.mark.skipif 标记根据条件跳过4. 执行pytest.skip()方法跳过测试用例 1.前言 在实际场景中,我们可能某条测试用例没写完,代码执行时会报错,或者是在一些条件下不让某些…...
spring boot 连接FTP实现文件上传
spring boot 连接FTP实现文件上传 maven: <!--ftp--><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.8.0</version></dependency>接口示例: ApiO…...
深入解析/etc/hosts.allow与 /etc/hosts.deny:灵活控制 Linux 网络访问权限
文章目录 深入解析/etc/hosts.allow与 /etc/hosts.deny:灵活控制 Linux 网络访问权限引言什么是 TCP Wrappers?工作原理 什么是 /etc/hosts.allow 和 /etc/hosts.deny?匹配规则配置语法详解配置示例允许特定 IP 访问 SSH 服务拒绝整个子网访问…...
短跑怎么训练提高最快·棒球1号位
棒球运动员的短跑能力直接影响跑垒、防守和进攻效率,提升短跑速度需结合专项需求(如爆发力、加速度、变向能力)进行系统训练。以下为针对性训练方案: 一、专项爆发力训练(提升起跑速度) 抗阻冲刺 用弹力带…...
USRP7440-通用软件无线电平台
1、产品描述 USRP7440基于第三代XILINX Zynq UltraScale RFSoC架构,它将射频ADC、DAC、ARM、FPGA等集成一体,瞬时带宽可以达到2.5GHz,尤其适合于射频直采应用,比如通信与雷达。 第一代RFSOC高达4GHz • 8x 或 16x 6.554GSPS DAC…...
51c大模型~合集48
我自己的原文哦~ https://blog.51cto.com/whaosoft/11940475 #Mini-Omni 让大模型能听会说,国内机构开源全球首个端到端语音对话模型 本文出自启元世界多模态算法组,共同一作是来自清华大学的一年级硕士生谢之非与启元世界多模态负责人吴昌桥&…...
004-利用Docker安装Mysql
利用Docker安装Mysql 一、在镜像仓库找到 Mysql1.镜像仓库地址2.复制命令3.下载Mysql镜像4.查看镜像 二、创建实例并启动三、用本地工具连接数据库四、设置 Mysql 配置 一、在镜像仓库找到 Mysql 1.镜像仓库地址 https://hub.docker.com 2.复制命令 docker pull mysql:8.0…...
Web自动化之Selenium添加网站Cookies实现免登录
在使用Selenium进行Web自动化时,添加网站Cookies是实现免登录的一种高效方法。通过模拟浏览器行为,我们可以将已登录状态的Cookies存储起来,并在下次自动化测试或爬虫任务中直接加载这些Cookies,从而跳过登录步骤。 Cookies简介 …...
UEditor集成Markdown编辑功能方案
分步解决方案: 1. 推荐免费开源Markdown库 推荐使用 markdown-it(MIT协议) 官网:https://github.com/markdown-it/markdown-it 特点:轻量级(15KB)、扩展性强、支持CommonMark规范、中文文档丰…...
综合练习 —— 递归、搜索与回溯算法
目录 一、1863. 找出所有子集的异或总和再求和 - 力扣(LeetCode) 算法代码: 代码思路 问题分析 核心思想 实现细节 代码解析 初始化 DFS 函数 时间复杂度 空间复杂度 示例运行 输入 运行过程 总结 二、 47. 全排列 II - 力扣&a…...
Python之使用动态导包优化软件加载速度
在开发大型 Python 软件时,可能会遇到以下问题:由于静态导入了大量模块,导致软件启动时间过长,用户体验不佳。例如,一个复杂的桌面应用程序或 Web 服务可能依赖于多个大型库(如 numpy、pandas、torch 或 Yolo),这些库在启动时被静态导入,即使某些功能模块在启动时并不…...
第16天:C++多线程完全指南 - 从基础到现代并发编程
第16天:C多线程完全指南 - 从基础到现代并发编程 一、多线程基础概念 1. 线程创建与管理(C11) #include <iostream> #include <thread>void hello() {std::cout << "Hello from thread " << std::this_…...