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

【Python 算法零基础 4.排序 ③ 插入排序】

目录

一、引言

二、算法思想

三、算法分析

1.时间复杂度

2.空间复杂度

3.算法的优点和缺点

① 算法的优点

② 算法的缺点

四、实战练习

1491. 去掉最低工资和最高工资后的工资平均值

思路与算法

① 插入排序算法 (insertSort 方法)

Ⅰ、初始化

Ⅱ、遍历未排序元素

Ⅲ、元素后移

② 计算平均工资 (average 方法)

Ⅰ、排序

Ⅱ、切片求和:

1619. 删除某些元素后的数组均值

思路与算法

① 插入排序算法 (insertSort 方法)

Ⅰ、初始化

Ⅱ、遍历未排序元素

Ⅲ、元素后移

② 计算截断均值 (trimMean 方法)

Ⅰ、排序数组

Ⅱ、计算截断比例

Ⅲ、切片求和

1984. 学生分数的最小差值

思路与算法

① 插入排序算法 (insertSort 方法)

Ⅰ、初始化

Ⅱ、遍历未排序元素

Ⅲ、元素后移

②  计算最小分数 (minimumDifference 方法)

Ⅰ、排序数组

Ⅱ、初始化结果

Ⅲ、遍历所有可能的子数组

Ⅳ、返回结果


接受平庸不是逃避,别让欲望击垮勇敢的你

                                                        —— 25.5.20

选择排序回顾

① 初始化从未排序序列开始,初始时整个数组都是未排序的。

② 寻找最小值遍历未排序部分的所有元素,找到其中的最小值。使用变量min记录最小值的索引,初始时假设当前未排序部分的第一个元素是最小的。

③ 交换元素:将找到的最小值与未排序部分的第一个元素交换位置。此时,未排序部分的第一个元素成为已排序序列的一部分。

④ 重复步骤 2-3缩小未排序部分的范围(从下一个元素开始),重复寻找最小值并交换的过程,直到整个数组排序完成。

def selection_sort(arr: List):n = len(arr)for i in range(n):min = ifor j in range(i+1, n):if arr[min] > arr[j]:arr[min], arr[j] = arr[j], arr[min]return arr

冒泡排序回顾

① 初始化获取数组长度 n

② 外层循环(控制轮数)遍历 i 从 0 到 n-1,共进行 n 轮。

        作用:每轮确定一个最大元素的位置(第 i 轮确定倒数第 i+1 大的元素)。

③ 内层循环(相邻元素比较)对于每轮 i,遍历 j 从 0 到 n-i-1:比较 arr[j] 和 arr[j+1]。若 arr[j] > arr[j+1],则交换两者位置。

        作用:将当前未排序部分的最大元素逐步交换到右侧。

④ 终止条件当 i 达到 n-1 时,所有元素已排序完成。

def bubble_sort(arr):n = len(arr)# 遍历所有数组元素for i in range(n):# 最后i个元素已经就位,无需再比较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

一、引言

        插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,直到整个数组有序。


二、算法思想

具体的算法步骤如下:

        ① 从第一个元素开始,将其视为已排序部分。

        ② 取出下一个元素,与已排序部分的元素进行比较。

        ③ 如果该元素小于已排序部分的最后一个元素,则将其插入到已排序部分的适当位置。

        ④ 重复步骤 ② 和 ③,直到整个数组都被排序

        首先,需要将第二个元素和第一个元素进行比较,如果前者 ≤ 后者,则将后者进行向后移动,前者则执行插入

         进行第二轮比较时,即第三个元素和第二、第一个元素比较,直到前三个元素都保持有序

        最后,经过一定轮次的比较和移动之后,一定可以保证所有元素都是按照升序排列的


三、算法分析

1.时间复杂度

        我们假设 「比较」和「移动」 的时间复杂度为 O(1)。

        「插入排序」 中有两个嵌套循环:

                外循环正好运行 n一1 次迭代。但内部循环运行变得越来越短:

                当i = 1,内层循环1次「比较」操作。

                当i = 2,内层循环 2次「比较」操作。

                当i = 3,内层循环3次「比较」操作。
                 ……
                当i = n - 2,内层循环n-2次「比较」操作,

                当i = n-1,内层循环n-1次「比较」操作。

        因此,总「比较」次数如下:1+2+...+(n-1) = n(n-1)/2。总的时间复杂度为:O(n^2)


2.空间复杂度

        由于算法在执行过程中,只有「移动」变量时候,需要事先将变量存入临时变量x,而其它没有采用任何的额外空间,所以空间复杂度为 O(1)。


3.算法的优点和缺点

① 算法的优点

1.简单易懂,易于实现。

2.适用于小型数组或基本有序的数组。

3.稳定性好,不会改变相等元素的相对顺序。

② 算法的缺点

1.对于大型无序数组,效率较低。

2.不适合大规模数据排序。


四、实战练习

1491. 去掉最低工资和最高工资后的工资平均值

给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。

请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。

示例 1:

输入:salary = [4000,3000,1000,2000]
输出:2500.00000
解释:最低工资和最高工资分别是 1000 和 4000 。
去掉最低工资和最高工资以后的平均工资是 (2000+3000)/2= 2500

示例 2:

输入:salary = [1000,2000,3000]
输出:2000.00000
解释:最低工资和最高工资分别是 1000 和 3000 。
去掉最低工资和最高工资以后的平均工资是 (2000)/1= 2000

示例 3:

输入:salary = [6000,5000,4000,3000,2000,1000]
输出:3500.00000

示例 4:

输入:salary = [8000,9000,2000,3000,6000,1000]
输出:4750.00000

提示:

  • 3 <= salary.length <= 100
  • 10^3 <= salary[i] <= 10^6
  • salary[i] 是唯一的。
  • 与真实值误差在 10^-5 以内的结果都将视为正确答案。

思路与算法

① 插入排序算法 (insertSort 方法)
Ⅰ、初始化

获取数组长度 n。从索引 1 开始遍历(因为索引 0 单独作为已排序部分)。

Ⅱ、遍历未排序元素

        对于每个索引 i(从 1 到 n-1):保存当前元素 current = arr[i]

        设置指针 j = i-1,指向已排序部分的最后一个元素。

Ⅲ、元素后移

循环条件:当 j >= 0 且 arr[j] > current 时:将 arr[j] 后移一位至 arr[j+1]j 减 1,继续向前检查。

插入当前元素:当循环结束时,j+1 即为 current 的正确位置,将其插入。

② 计算平均工资 (average 方法)
Ⅰ、排序

调用 insertSort 对工资数组 salary 进行升序排序。

Ⅱ、切片求和

截取数组的中间部分(排除第一个和最后一个元素):salary[1:-1]

计算切片的总和,并除以元素个数 len(salary) - 2

class Solution:def insertSort(self, arr: List):n = len(arr)# 从第二个元素开始遍历,因为第一个元素已经是有序的for i in range(1, n):# 当前要插入的元素current = arr[i]# 已排序部分的最后一个元素的索引j = i - 1# 从后向前扫描已排序部分,将比current大的元素向后移动while j >= 0 and arr[j] > current:arr[j + 1] = arr[j]  # 元素后移j -= 1# 插入当前元素到正确位置arr[j + 1] = currentreturn arrdef average(self, salary: List[int]) -> float:self.insertSort(salary)return sum(salary[1: -1]) / (len(salary) - 2)


1619. 删除某些元素后的数组均值

给你一个整数数组 arr ,请你删除最小 5% 的数字和最大 5% 的数字后,剩余数字的平均值。

与 标准答案 误差在 10-5 的结果都被视为正确结果。

示例 1:

输入:arr = [1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3]
输出:2.00000
解释:删除数组中最大和最小的元素后,所有元素都等于 2,所以平均值为 2 。

示例 2:

输入:arr = [6,2,7,5,1,2,0,3,10,2,5,0,5,5,0,8,7,6,8,0]
输出:4.00000

示例 3:

输入:arr = [6,0,7,0,7,5,7,8,3,4,0,7,8,1,6,8,1,1,2,4,8,1,9,5,4,3,8,5,10,8,6,6,1,0,6,10,8,2,3,4]
输出:4.77778

示例 4:

输入:arr = [9,7,8,7,7,8,4,4,6,8,8,7,6,8,8,9,2,6,0,0,1,10,8,6,3,3,5,1,10,9,0,7,10,0,10,4,1,10,6,9,3,6,0,0,2,7,0,6,7,2,9,7,7,3,0,1,6,1,10,3]
输出:5.27778

示例 5:

输入:arr = [4,8,4,10,0,7,1,3,7,8,8,3,4,1,6,2,1,1,8,0,9,8,0,3,9,10,3,10,1,10,7,3,2,1,4,9,10,7,6,4,0,8,5,1,2,1,6,2,5,0,7,10,9,10,3,7,10,5,8,5,7,6,7,6,10,9,5,10,5,5,7,2,10,7,7,8,2,0,1,1]
输出:5.29167

提示:

  • 20 <= arr.length <= 1000
  • arr.length 是 20 的 倍数 
  • 0 <= arr[i] <= 105

思路与算法

① 插入排序算法 (insertSort 方法)
Ⅰ、初始化

获取数组长度 n。从索引 1 开始遍历(因为索引 0 单独作为已排序部分)。

Ⅱ、遍历未排序元素

        对于每个索引 i(从 1 到 n-1):保存当前元素 current = arr[i]

        设置指针 j = i-1,指向已排序部分的最后一个元素。

Ⅲ、元素后移

循环条件:当 j >= 0 且 arr[j] > current 时:将 arr[j] 后移一位至 arr[j+1]j 减 1,继续向前检查。

插入当前元素:当循环结束时,j+1 即为 current 的正确位置,将其插入。

② 计算截断均值 (trimMean 方法)
Ⅰ、排序数组

调用 insertSort 对数组进行升序排序。

Ⅱ、计算截断比例

数组长度为 n,则需去除的元素数量为 s = n // 20(即 5%)。

Ⅲ、切片求和

截取数组中间的部分:arr[s:-s],即去除前 s 个和后 s 个元素。

计算切片的总和,并除以剩余元素的数量(即 0.9 * n,因为去除了 10% 的元素)。

class Solution:def insertSort(self, arr: List):n = len(arr)# 从第二个元素开始遍历,因为第一个元素已经是有序的for i in range(1, n):# 当前要插入的元素current = arr[i]# 已排序部分的最后一个元素的索引j = i - 1# 从后向前扫描已排序部分,将比current大的元素向后移动while j >= 0 and arr[j] > current:arr[j + 1] = arr[j]  # 元素后移j -= 1# 插入当前元素到正确位置arr[j + 1] = currentreturn arrdef trimMean(self, arr: List[int]) -> float:arr = self.insertSort(arr)n = len(arr)s = n // 20return sum(arr[s:-s]) / (0.9 * n)


1984. 学生分数的最小差值

给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。

从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。

返回可能的 最小差值 。

示例 1:

输入:nums = [90], k = 1
输出:0
解释:选出 1 名学生的分数,仅有 1 种方法:
- [90] 最高分和最低分之间的差值是 90 - 90 = 0
可能的最小差值是 0

示例 2:

输入:nums = [9,4,1,7], k = 2
输出:2
解释:选出 2 名学生的分数,有 6 种方法:
- [9,4,1,7] 最高分和最低分之间的差值是 9 - 4 = 5
- [9,4,1,7] 最高分和最低分之间的差值是 9 - 1 = 8
- [9,4,1,7] 最高分和最低分之间的差值是 9 - 7 = 2
- [9,4,1,7] 最高分和最低分之间的差值是 4 - 1 = 3
- [9,4,1,7] 最高分和最低分之间的差值是 7 - 4 = 3
- [9,4,1,7] 最高分和最低分之间的差值是 7 - 1 = 6
可能的最小差值是 2

提示:

  • 1 <= k <= nums.length <= 1000
  • 0 <= nums[i] <= 105

思路与算法

① 插入排序算法 (insertSort 方法)
Ⅰ、初始化

获取数组长度 n。从索引 1 开始遍历(因为索引 0 单独作为已排序部分)。

Ⅱ、遍历未排序元素

        对于每个索引 i(从 1 到 n-1):保存当前元素 current = arr[i]

        设置指针 j = i-1,指向已排序部分的最后一个元素。

Ⅲ、元素后移

循环条件:当 j >= 0 且 arr[j] > current 时:将 arr[j] 后移一位至 arr[j+1]j 减 1,继续向前检查。

插入当前元素:当循环结束时,j+1 即为 current 的正确位置,将其插入。

②  计算最小分数 (minimumDifference 方法)
Ⅰ、排序数组

调用 insertSort 对数组进行升序排序。

Ⅱ、初始化结果

设置初始结果 res 为 100000(根据题目约束,这是可能的最大值)。

Ⅲ、遍历所有可能的子数组

对于每个起始索引 i(范围 0 到 n - k):计算对应的结束索引 r = i + k - 1。计算子数组 nums[l:r+1] 的分数(即 nums[r] - nums[l])。更新 res 为当前分数与历史最小分数的较小值。

Ⅳ、返回结果

遍历结束后,res 即为最小分数。

class Solution:def insertSort(self, arr: List):n = len(arr)# 从第二个元素开始遍历,因为第一个元素已经是有序的for i in range(1, n):# 当前要插入的元素current = arr[i]# 已排序部分的最后一个元素的索引j = i - 1# 从后向前扫描已排序部分,将比current大的元素向后移动while j >= 0 and arr[j] > current:arr[j + 1] = arr[j]  # 元素后移j -= 1# 插入当前元素到正确位置arr[j + 1] = currentreturn arrdef minimumDifference(self, nums: List[int], k: int) -> int:self.insertSort(nums)# 题目中给的最大值是10 ^ 5n = len(nums)res = 100000for i in range(n + 1 - k):l = ir = i + k -1res = min(res, nums[r] - nums[l])return res

相关文章:

【Python 算法零基础 4.排序 ③ 插入排序】

目录 一、引言 二、算法思想 三、算法分析 1.时间复杂度 2.空间复杂度 3.算法的优点和缺点 ① 算法的优点 ② 算法的缺点 四、实战练习 1491. 去掉最低工资和最高工资后的工资平均值 思路与算法 ① 插入排序算法 (insertSort 方法) Ⅰ、初始化 Ⅱ、遍历未排序元素 Ⅲ、元素后移…...

LangGraph实现多智能体的方法

生活中我们常常需要同时处理多个任务&#xff0c;比如预订旅行时&#xff0c;既要订机票&#xff0c;又要订酒店。如果有一个智能助手能同时帮你搞定这些事情&#xff0c;那该有多方便啊&#xff01;LangGraph的多智能体系统就能做到这一点。它就像一个超级助手团队&#xff0c…...

wordpress主题开发中常用的12个模板文件

在WordPress主题开发中&#xff0c;有多种常用的模板文件&#xff0c;它们负责控制网站不同部分的显示内容和布局&#xff0c;以下是一些常见的模板文件&#xff1a; 1.index.php 这是WordPress主题的核心模板文件。当没有其他更具体的模板文件匹配当前页面时&#xff0c;Wor…...

聚铭安全管家平台2.0重磅发布——大模型智驱高效降本新方向

【聚铭安全管家平台2.0正式发布】在数字化安全威胁日益严峻的背景下&#xff0c;聚铭网络创新推出安全管家平台2.0&#xff0c;首创"云端智能区域中台本地终端"三级协同架构&#xff0c;深度融合AI安全大模型技术&#xff0c;实现威胁智能研判与自动化响应。该平台通…...

Android singleTop启动模式开启新页面

在Android开发中,Activity的启动模式(Launch Mode)对应用的行为和用户体验影响非常大。其中,singleTop是一种常见的启动模式,但它常常让开发者困惑:当一个Activity设置为singleTop时,如何才能重新打开一个新的页面(实例)? 本文将详细解析singleTop启动模式的机制,为…...

使用注解动态映射:根据实体List列表动态生成Excel文件

我们一般通过POI来生成对应的Excel文件&#xff0c;绝大多数情况是需要手动编写单元格内容&#xff0c;然后顺序填充值&#xff0c;今天我们将动态根据实体来生成Excel表头&#xff0c;同时自动填充内容。 文章目录 1. 定义注解2. 实体类应用注解3. 动态导出工具类 1. 定义注解…...

基于cornerstone3D的dicom影像浏览器 第二十一章 显示DICOM TAGS

系列文章目录 第一章 下载源码 运行cornerstone3D example 第二章 修改示例crosshairs的图像源 第三章 vitevue3cornerstonejs项目创建 第四章 加载本地文件夹中的dicom文件并归档 第五章 dicom文件生成png&#xff0c;显示检查栏&#xff0c;序列栏 第六章 stack viewport 显…...

【循环位运算——uint32,DP】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; using uint unsigned;const int N 1010;ll f[N][N]; uint a[N]; int n, m;int main() {ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m;for(int i 1; i < n; i)cin …...

贪心介绍 LeetCode 455.分发饼干 LeetCode 376. 摆动序列 LeetCode 53. 最大子序和

贪心介绍 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 eg: 有一堆钞票&#xff0c;你可以拿走十张&#xff0c;如果想达到最大的金额&#xff0c;你要怎么拿&#xff1f; 指定每次拿最大的&#xff0c;最终结果就是拿走最大数额的钱。每次拿最大的就…...

算法学习笔记·数学·快速幂

题目:(AcWing) 给定 n 组 ai,bi,pi&#xff0c;对于每组数据&#xff0c;求出 aibimodpi 的值。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含三个整数 ai,bi,pi。 输出格式 对于每组数据&#xff0c;输出一个结果&#xff0c;表示 abiimodpi 的值。 每…...

Postgresql 数据库体系架构

1 postgresql 软件目录 rootu24-pg-110:~# tree -L 1 /usr/local/postgresql-17/ /usr/local/postgresql-17/ ├── bin #可执行二进制文件 ├── include ├── lib └── share 2 数据库目录及文件 #目录结构 base --每个数据库的子目录 global --数据库集簇范…...

[创业之路-377]:企业战略管理案例分析-战略制定/设计-市场洞察“五看”:看宏观之社会发展趋势:数字化、智能化、个性化的趋势对初创公司的战略机会

数字化、智能化、个性化趋势为初创公司带来了捕捉长尾需求、提升运营效率、创新商业模式等战略机会&#xff0c;具体分析如下&#xff1a; 一、数字化趋势带来的战略机会 捕捉长尾需求&#xff1a;数字化技术能够帮助初创公司更好地捕捉市场中的长尾需求&#xff0c;满足那些…...

Vue框架1(vue搭建方式1,vue指令,vue实例生命周期)

一.VUE vue概述(vue.js) vue是前端JavaScript框架,对JavaScript进行封装,是一套用于构建用户界面的渐进式框架.vue的核心只关注图示层,不仅易上手,还便于与第三方库或既有的项目整合. vue.js和Angular.js,React.js一起,并称为前端三大主流框架 注意: 在此初步学习的是vue…...

分布式系统核心技术全解析

目录 分布式系统的本质 分布式系统的核心特点 分布式系统的典型应用场景 分布式系统的挑战 CAP理论 一、CAP 三要素定义 1. 一致性&#xff08;Consistency&#xff09; 2. 可用性&#xff08;Availability&#xff09; 3. 分区容错性&#xff08;Partition Tolerance…...

skywalking 10.2 源码编译

1.源码下载 Downloads | Apache SkyWalking 选择 SkyWalking APM 最新版下载&#xff0c; 下载后&#xff0c;在本地解压。 2.Idea加载工程 2.1 根目录pom文件删除checkstyle 插件 后续做二开时避免代码风格校验报错 2.2 删除apm-webapp 工程中 frontend-maven-plugin插件…...

C++ --- string

C --- string 简介1、构造函数2、迭代器&#xff08;主流的遍历方式&#xff09;2.1字符串经典遍历和修改的方式2.2使用迭代器遍历和修改字符串2.3使用范围for遍历对象&#xff08;C11支持的新特性&#xff09; 3、常见&#xff0c;常用方法或重载3.1查询大小和容量管理3.2增3.…...

Android Studio 连接夜神模拟器 自动断开的问题

版本情况&#xff1a; Android Studio Meerkat Feature Drop | 2024.3.2 Build #AI-243.25659.59.2432.13423653, built on April 30, 2025 Runtime version: 21.0.6-13368085-b895.109 amd64夜神模拟器 V7.0.5.9046 问题描述&#xff1a; cmd命令行使用adb连接夜神模拟器成…...

Python入门手册:Python中的数据结构类型

在Python中&#xff0c;数据结构是组织和存储数据的方式&#xff0c;它们允许你以高效的方式操作和处理数据。Python提供了几种内置的数据结构&#xff0c;包括列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;、集合&#xff08;Set&#xff09;和字典&a…...

《P3435 [POI 2006] OKR-Periods of Words》

题目描述 一个字符串是由有限个小写英文字母组成的序列。特别地&#xff0c;它可以是一个空序列&#xff0c;即由 0 个字母组成的序列。我们用 ABC 表示字符串 A 是通过连接字符串 B 和 C&#xff08;按此顺序&#xff09;得到的&#xff08;即一个接一个地写在一起&#xff0…...

C/C++---隐式显式转换

1. 隐式转换&#xff08;Implicit Conversion&#xff09; 隐式转换是编译器主动进行的类型转换&#xff0c;无需程序员额外编写代码。这种转换一般发生在赋值、函数调用、表达式计算等场景中。 1.1 隐式转换的常见场景 数值类型转换&#xff1a;从较小的类型转换为较大的类…...

巡礼中国西极·跨越昆仑天山 | 北斗卫星徽章护航昆仑科考

神秘深邃&#xff0c;遗世独立。帕米尔高原&#xff0c;横亘于中亚东南部&#xff0c;我国的最西端&#xff0c;面积约10万平方千米&#xff0c;平均海拔4500米以上&#xff0c;古代丝绸之路在此经过。昆盖山&#xff0c;一座掩藏在帕米尔高原褶皱深处、鲜为人知的山脉&#xf…...

Vue常用自定义指令-积累的魅力【VUE】

前言 在【自定义指令—v2与v3之间的区别【VUE基础】一文中&#xff0c;整理了自定义指令部分vue2和vue3 两个版本的区别&#xff0c;有兴趣的伙伴或者针对自定义部分比较迷茫的伙伴可以跳转看一下。此次主要介绍一些自己积累的一些自定义指令的代码&#xff0c;与大家一起分享。…...

LangChain4j第三篇: RAG的简单应用与实践

引言:RAG 构建属于你的大模型 大语言模型(LLM)的知识体系本质上仅限于它所接受的训练数据。 其一在知识时效性方面,模型参数固化于训练完成的时点,而现实世界中的知识和信息持续动态更新。 其二在非公开数据层面,企业内部的机密文档(如产品设计图、商业策略等)及个人隐…...

机器学习第二十六讲:官方示例 → 跟着菜谱学做经典菜肴

机器学习第二十六讲&#xff1a;官方示例 → 跟着菜谱学做经典菜肴 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 以跟着菜谱学…...

功能强大且易于使用的 JavaScript 音频库howler.js 和AI里如何同时文字跟音频构思想法

howler.js 是一个功能强大且易于使用的 JavaScript 音频库&#xff0c;它提供了跨浏览器的音频播放功能&#xff0c;支持多种音频格式&#xff0c;并且具有丰富的 API&#xff0c;可以方便地控制音频的播放、暂停、循环、音量等。下面是如何在 Vue 项目中使用 howler.js 实现音…...

品鉴JS的魅力之防抖与节流【JS】

前言 小水一波&#xff0c;函数的防抖与节流。 文章目录 前言介绍实现方式防抖节流 介绍 防抖与节流的优化逻辑&#xff0c;在我们的日常开发中&#xff0c;有着一定的地位。 防抖和节流是两种常用的性能优化技术&#xff0c;用于限制某个函数在一定时间内被触发的次数,减少不…...

如何使用patch-package给npm包打补丁

一、背景 在移动应用开发中,轮播是一种很常见的效果,我们项目采用的是RN跨平台技术,RN的轮播我们直接使用的是第三方插件:react-native-snap-carousel。不过,当我们在项目中使用的时候却发现Android和iOS的表现不一致:https://stackoverflow.com/questions/60711611/rea…...

maxkey单点登录系统

github地址 https://github.com/MaxKeyTop/MaxKey/blob/master/README_zh.md 1、官方镜像 https://hub.docker.com/u/maxkeytop 2、MaxKey:Docker快速部署 参考地址&#xff1a; Docker部署 | MaxKey单点登录认证系统 拉取docker脚本MaxKey: Dromara &#x1f5dd;️MaxK…...

windows bat 在目录下(包括子目录)搜索批量指定文件名称复制到另一个文件夹内

windows bat 在目录下(包括子目录)搜索批量指定文件名称复制到另一个文件夹内 前言&#xff1a;最近遇到一个需求&#xff0c;我有15个文件夹(可能包含子文件夹) &#xff0c;目前我有一批文件名称&#xff0c;需要在这15个文件夹中查找出来&#xff0c;并拷贝到一个新的文件夹…...

Notepad++ 下载与安装教程(小白专属)

文章目录 Notepad下载渠道的专业选择1. 官方网站下载&#xff08;海外用户或网络条件优越者首选&#xff09;2. 国内优化下载地址&#xff08;国内用户高效选择&#xff09; Notepad精细化安装流程解析总结与后续建议 在当前的开发与文本处理工作中&#xff0c;Notepad无疑是一…...