代码随想录-Day38
509. 斐波那契数
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
示例 1:
输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:
输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2
示例 3:
输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3
方法一:
class Solution {public int fib(int n) {if (n < 2) return n;int a = 0, b = 1, c = 0;for (int i = 1; i < n; i++) {c = a + b;a = b;b = c;}return c;}
}
这段代码是使用Java编写的,实现了一个计算斐波那契数列第n项的函数。斐波那契数列定义为每个数字是前两个数字之和,通常以0和1开始。这里是一个详细解析:
函数签名
public int fib(int n)
该函数名为fib,接受一个整数参数n,返回计算出的斐波那契数列的第n项。
函数逻辑
-
基本情况处理:
if (n < 2) return n;如果
n小于2(即n为0或1),直接返回n,因为斐波那契数列的前两项分别是0和1。 -
迭代计算斐波那契数:
初始化三个整数变量:int a = 0, b = 1, c = 0;其中,
a和b用于存储当前要相加的两个斐波那契数,初始化为0和1;c用于存储它们的和。接下来是一个
for循环,从1遍历到n-1(因为a和b已经表示了第一项和第二项):for (int i = 1; i < n; i++) {c = a + b;a = b;b = c; }在每次循环中,先计算
a和b的和赋值给c,然后将b的值赋予a,将c的值赋予b,这样a和b始终指向当前需要考虑的斐波那契数列的两项,而c则保存了新的和。 -
返回结果:
循环结束后,c中存储的就是斐波那契数列的第n项,直接返回c即可。
示例
例如,如果调用fib(6),函数会返回斐波那契数列的第6项,计算过程如下:
- 初始:
a=0, b=1, c=0 - 第1次循环后:
a=1, b=1, c=1 - 第2次循环后:
a=1, b=2, c=3 - 第3次循环后:
a=2, b=3, c=5 - 第4次循环后:
a=3, b=5, c=8 - 第5次循环后:
a=5, b=8, c=13
因此,fib(6)返回13。
方法二:
//非压缩状态的版本
class Solution {public int fib(int n) {if (n <= 1) return n; int[] dp = new int[n + 1];dp[0] = 0;dp[1] = 1;for (int index = 2; index <= n; index++){dp[index] = dp[index - 1] + dp[index - 2];}return dp[n];}
}
这段代码是使用Java语言实现的一个计算斐波那契数列第n项的函数。斐波那契数列是一个经典的数列,其中每一项都是前两项的和,通常以0和1开始。下面是这段代码的详细解释:
函数签名
public int fib(int n)
这个函数名为fib,接收一个整数n作为参数,返回斐波那契数列的第n项。
函数逻辑
-
基本情况处理:
if (n <= 1) return n;如果输入的
n小于或等于1,根据斐波那契数列的定义,直接返回n自身,因为fib(0)=0且fib(1)=1。 -
初始化动态规划数组:
int[] dp = new int[n + 1]; dp[0] = 0; dp[1] = 1;创建一个长度为
n+1的数组dp来存储斐波那契数列的值,其中dp[0]=0和dp[1]=1对应斐波那契数列的前两项。 -
动态规划填充数组:
for (int index = 2; index <= n; index++){dp[index] = dp[index - 1] + dp[index - 2]; }从索引2开始遍历到
n(包含n),使用循环依次计算并存储斐波那契数列的每一项。每一项dp[index]的值由前两项dp[index - 1]和dp[index - 2]的和计算得出,这是斐波那契数列的基本定义。 -
返回结果:
return dp[n];在循环结束后,数组
dp的最后一个元素dp[n]即为斐波那契数列的第n项,所以直接返回该值。
示例
比如,如果调用fib(6),函数会计算并返回斐波那契数列的第6项,即0, 1, 1, 2, 3, 5, 8中的8。
这种方法称为动态规划,相较于递归解法,它避免了重复计算,提高了效率,特别是在计算较大的n时更为明显。
70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶

方法一:
// 常规方式
public int climbStairs(int n) {int[] dp = new int[n + 1];dp[0] = 1;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];
}
这段代码是使用Java语言实现的一种动态规划方法,用于解决“爬楼梯”问题。问题描述如下:假设你正在爬一个楼梯,每次你可以爬1阶或者2阶。给定楼梯的总阶数n,返回爬到楼顶的方法总数。
代码解析
-
初始化: 创建一个长度为
n + 1的整型数组dp,用来存储爬到各个阶梯的方法数。dp[0]和dp[1]都初始化为1,表示爬到第0阶有1种方法(即不爬),爬到第1阶也有1种方法(直接爬一阶上去)。 -
状态转移方程: 对于
dp[i](其中i >= 2),可以根据状态转移方程dp[i] = dp[i - 1] + dp[i - 2]来计算,即爬到第i阶的方法数等于爬到第i - 1阶的方法数加上爬到第i - 2阶的方法数。这是因为到达第i阶,要么是从第i - 1阶爬一阶上来,要么是从第i - 2阶爬两阶上来。 -
返回结果: 最终,
dp[n]就是爬到第n阶楼梯的方法总数,因此返回dp[n]作为答案。
举例说明
假设n = 3,即有3阶楼梯,按照代码逻辑计算过程如下:
dp[0] = 1,dp[1] = 1- 计算
dp[2]时,dp[2] = dp[1] + dp[0] = 1 + 1 = 2,表示到第2阶有2种方法(1+1 或者 2)。 - 计算
dp[3]时,dp[3] = dp[2] + dp[1] = 2 + 1 = 3,表示到第3阶有3种方法(1+1+1, 1+2, 或者 2+1)。
因此,当n = 3时,返回的结果是3,即有3种不同的方法爬到楼顶。
方法二:
// 用变量记录代替数组
class Solution {public int climbStairs(int n) {if(n <= 2) return n;int a = 1, b = 2, sum = 0;for(int i = 3; i <= n; i++){sum = a + b; // f(i - 1) + f(i - 2)a = b; // 记录f(i - 1),即下一轮的f(i - 2)b = sum; // 记录f(i),即下一轮的f(i - 1)}return b;}
}
这段代码是使用Java语言实现的一个简化版的动态规划方法来解决“爬楼梯”问题。与之前使用数组记录每个阶梯的方法数不同,这里仅使用了三个变量a、b和sum来减少空间复杂度,达到了O(1)的空间复杂度要求,而时间复杂度仍然是O(n)。下面是代码的详细解释:
代码逻辑解析
-
基础情况处理: 如果输入的阶数
n小于等于2,直接返回n,因为当只有1阶或2阶楼梯时,方法数分别为1和2。 -
变量初始化: 定义三个整型变量
a、b和sum,其中a和b分别初始化为1和2,对应爬到第一阶和第二阶楼梯的方法数。sum用来临时存储每轮循环中爬到当前阶的方法数。 -
循环计算: 从第三阶楼梯(
i = 3)开始计算,直到目标阶数n。在每次循环中:- 计算
sum = a + b,即当前阶的方法数等于前一阶的方法数加上前两阶的方法数。 - 更新
a = b,把当前的b值(即上一阶的方法数)赋给a,为下一轮计算做准备。 - 更新
b = sum,把刚计算出来的sum(当前阶的方法数)赋给b,为下一轮计算做准备。
- 计算
-
返回结果: 循环结束后,变量
b中存储的就是爬到n阶楼梯的方法总数,直接返回b。
举例说明
假设我们要计算爬5阶楼梯的方法数,过程如下:
- 初始:
a = 1(到第1阶的方法数),b = 2(到第2阶的方法数)。 - 第一轮计算(阶数3):
sum = a + b = 1 + 2 = 3,更新后a = 2,b = 3。 - 第二轮计算(阶数4):
sum = a + b = 2 + 3 = 5,更新后a = 3,b = 5。 - 第三轮计算(阶数5):
sum = a + b = 3 + 5 = 8,此时b即为爬到第5阶的方法数。
最终返回b = 8,表示有8种不同的方法可以爬到5阶楼梯的顶部。
746. 使用最小花费爬楼梯
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
示例 1:
输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。
示例 2:
输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。

方法一:
// 方式一:第一步不支付费用
class Solution {public int minCostClimbingStairs(int[] cost) {int len = cost.length;int[] dp = new int[len + 1];// 从下标为 0 或下标为 1 的台阶开始,因此支付费用为0dp[0] = 0;dp[1] = 0;// 计算到达每一层台阶的最小费用for (int i = 2; i <= len; i++) {dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[len];}
}
这段Java代码是解决“最小成本爬楼梯”问题的一个实现。给定一个非负整数数组 cost,其中 cost[i] 是爬到第 i 阶楼梯的成本。一旦你支付了爬到某阶楼梯的成本,就可以选择不再支付直接爬到更高一层或者爬两层。该函数的目标是计算达到顶层楼梯的最低花费。这里采用的是自底向上的动态规划方法。
代码解析:
-
初始化:首先,定义数组
dp来存储到达每个楼层的最小成本,数组长度为len + 1,因为我们要计算到达最后一阶楼梯之上(即到达顶层)的成本。初始化dp[0]和dp[1]为0,意味着从地面(下标0)或第一个台阶(下标1)开始爬,不需要额外支付费用。 -
动态规划状态转移:遍历从下标2到
len(包括len),对于每个位置i,有两种方式到达:一是从i-1阶楼梯爬上来,二是从i-2阶楼梯爬上来。因此,到达第i阶楼梯的最小成本可以通过比较这两种方式的成本并取最小值得到,即dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])。 -
返回结果:遍历结束后,
dp[len]存储的就是到达顶层楼梯的最小成本,直接返回这个值。
示例说明:
假设 cost = [10, 15, 20],表示爬到第一阶楼梯成本为0(根据初始化逻辑),第二阶为10,第三阶为15。按照上述逻辑计算:
dp[2] = min(dp[1] + cost[1], dp[0] + cost[0]) = min(0 + 10, 0 + 0) = 10dp[3] = min(dp[2] + cost[2], dp[1] + cost[1]) = min(10 + 20, 0 + 15) = 15
因此,到达顶层(即第三阶楼梯之上)的最小成本为15,这就是函数的返回值。
方法二:
// 方式二:第一步支付费用
class Solution {public int minCostClimbingStairs(int[] cost) {int[] dp = new int[cost.length];dp[0] = cost[0];dp[1] = cost[1];for (int i = 2; i < cost.length; i++) {dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];}//最后一步,如果是由倒数第二步爬,则最后一步的体力花费可以不用算return Math.min(dp[cost.length - 1], dp[cost.length - 2]);}
}
这段Java代码也是解决“最小成本爬楼梯”问题的一个实现,但与之前的方式稍有不同。这里是假设从第一阶楼梯开始就需要支付费用,然后采用动态规划的方法来求解到达顶层楼梯的最小花费。具体解析如下:
代码解析:
-
初始化:首先,定义一个长度与输入数组
cost相同的数组dp,用来存储到达每个阶梯时的最小花费。初始化dp[0]和dp[1]分别为cost[0]和cost[1],表示从地面到第一阶和到第二阶的花费。 -
动态规划状态转移:从下标为2的位置开始遍历至数组末尾(不包括),对于每一个位置
i,到达此处的最小花费等于前一阶梯的最小花费和前前一阶梯的最小花费中的较小者,再加上当前位置i的花费。即dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]。这样做是为了确保以最少的花费到达当前阶梯。 -
返回结果:到达顶层楼梯有两种情况,一种是从倒数第一阶直接上,一种是从倒数第二阶上。因此,返回
dp[cost.length - 1]和dp[cost.length - 2]中的较小值,即为最小成本。注意,这里最后一步不额外计算费用,因为到达倒数第二阶时,已经计算了到达顶层所需的最小花费。
示例说明:
如果 cost = [10, 15, 20],则:
dp[0] = 10dp[1] = 15- 遍历过程中,
dp[2] = min(dp[1], dp[0]) + cost[2] = min(15, 10) + 20 = 10 + 20 = 30
最后,Math.min(dp[2], dp[1]) = Math.min(30, 15),因此返回 15 作为最小成本。
这种方式同样高效地解决了问题,但注意其假设前提与之前的方式不同,是从第一阶开始就需要支付费用。
方法三:
// 状态压缩,使用三个变量来代替数组
class Solution {public int minCostClimbingStairs(int[] cost) {// 以下三个变量分别表示前两个台阶的最少费用、前一个的、当前的。int beforeTwoCost = 0, beforeOneCost = 0, currentCost = 0;// 前两个台阶不需要费用就能上到,因此从下标2开始;因为最后一个台阶需要跨越,所以需要遍历到cost.lengthfor (int i = 2; i <= cost.length; i ++) {// 此处遍历的是cost[i - 1],不会越界currentCost = Math.min(beforeOneCost + cost[i - 1], beforeTwoCost + cost[i - 2]);beforeTwoCost = beforeOneCost;beforeOneCost = currentCost;}return currentCost;}
}
这段Java代码是解决“最小成本爬楼梯”问题的另一种实现,采用了状态压缩的方法,即使用三个变量而不是数组来存储到达每个阶梯所需的最小成本。这种方式减少了空间复杂度,但仍然保持了动态规划的思想。下面是详细的解析:
代码解析:
-
变量定义:定义三个整型变量
beforeTwoCost、beforeOneCost和currentCost,分别代表到达前两个台阶、前一个台阶和当前台阶的最小成本。初始时,前两个台阶和前一个台阶的最小成本都设为0,因为题目中并没有明确指出从第一个台阶开始就有费用,但根据逻辑推断,此处默认从地面到第一个和第二个台阶是免费的,或者理解为beforeTwoCost和beforeOneCost是站在第一阶和第二阶的费用,自然为0。 -
循环遍历:从
i = 2开始遍历至cost.length(包含cost.length,意味着考虑到达顶层楼梯后的状态),这一步是基于从地面(下标0)或第一个台阶(下标1)出发的逻辑,但因为cost数组的下标是从0开始的,所以计算时访问的是cost[i - 1]和cost[i - 2]。 -
状态转移:在每次循环中,计算到达当前台阶的最小成本
currentCost,通过比较从上一个台阶和前一个台阶到达当前台阶的最小花费。具体来说,currentCost = Math.min(beforeOneCost + cost[i - 1], beforeTwoCost + cost[i - 2]),表示当前到达的阶梯可以通过上一个阶梯或跳过一个阶梯从更早的阶梯到达,选择其中成本较小的路径。 -
状态更新:更新
beforeTwoCost和beforeOneCost的值,为下一次迭代做准备。即将当前的beforeOneCost赋值给beforeTwoCost,将刚刚计算的currentCost赋值给beforeOneCost。 -
返回结果:循环结束后,
currentCost即为到达顶层楼梯所需的最小成本,直接返回。
示例说明:
如果输入数组cost = [10, 15, 20],则遍历过程如下:
- 初始化:
beforeTwoCost = 0,beforeOneCost = 0 - 第一轮计算(
i = 2):currentCost = min(0 + 10, 0 + 0) = 10,更新后beforeTwoCost = 0,beforeOneCost = 10 - 第二轮计算(
i = 3):currentCost = min(10 + 15, 0 + 20) = 20,更新后beforeTwoCost = 10,beforeOneCost = 20
遍历结束,currentCost = 20即为最小成本,因此返回20。
相关文章:
代码随想录-Day38
509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 …...
CSS阴影优化气泡框样式
<body> <div class"pop">气泡框</div> </body>body{display: flex;justify-content: center;align-items: center;height: 100% } .pop{display: flex;justify-content: center;align-items: center;background: #409eff;width: 150px;heigh…...
强化安全新篇章:韶关石油化工可燃气体报警器年检解析
韶关,这座位于广东省北部的城市,近年来在石油化工行业取得了显著的发展。 随着一批批大型石化企业的进驻和投产,韶关不仅成为了区域性的石化产业基地,也为地方经济带来了强劲的增长动力。 然而,随着石化产业的快速发…...
Centos7 Docker部署PgSQL
拉取镜像 docker pull postgres:14.7运行容器 docker run --restartalways --nethost --shm-size"2g" --name pgsql -v /home/postgresql/data/pgdata:/var/lib/postgresql/data -v /etc/localtime:/etc/localtime -e POSTGRES_PASSWORDtest2023 -d postgres:14…...
LeetCode:经典题之21、24 题解及延伸
系列目录 88.合并两个有序数组 52.螺旋数组 567.字符串的排列 643.子数组最大平均数 150.逆波兰表达式 61.旋转链表 160.相交链表 83.删除排序链表中的重复元素 389.找不同 1491.去掉最低工资和最高工资后的工资平均值 896.单调序列 206.反转链表 92.反转链表II 141.环形链表 …...
【C++11】initializer_list详解!
一、什么是initializer_list? nitializer_list 是一种C11新的类型特性,它允许我们以统一的方式初始化对象。它是一个代表数组的轻量级包装器,通常用于构造函数和函数参数中,以允许传递一个初始化元素列表。 initializer_list也是一种模板类…...
如何在Java中处理UnsupportedOperationException异常?
如何在Java中处理UnsupportedOperationException异常? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java编程中,我们经常会遇到各…...
WPS没保存关闭了怎么恢复数据?4个方法(更新版)
想象一下,你正在用WPS奋笔疾书,灵感如泉水般涌出,突然间,电脑却跟你开了个玩笑——啪地一下,文档未保存就关闭了!是不是感觉像是被泼了一盆冷水,所有的热情瞬间熄灭?别急,…...
elementplus el-table(行列互换)转置
Element Plus v2.4.0, repl v3.4.0 <template> <div><el-table :data"tableData" style"width: 100%"><el-table-column prop"name" label"名字" width"180" /><el-table-column prop"wei…...
Gradle 核心之 Task
一、前言 只有 Task 才可以在 Gradle 的执行阶段去执行(其实质是执行的 Task 中的一系列 Action),所以 Task 的重要性不言而喻。 二、Task 2.1 Task 定义与配置 Task 的定义方式有如下两种: Task 的配置方式也有如下两种…...
【React 】折叠面板,点击展开时再请求数据
需求背景:使用折叠面板的形式展示数据,面板内部数据需要在打开时请求接口获取。 遇到问题:最开始使用Antd 的折叠面板组件,它对于数据直接渲染是没问题的,但是不好满足打开面板时再动态加载数据的需求,于是…...
c++学习 文件操作,模板
文件操作 #include<iostream> #include<string> #include<fstream> using namespace std; //文本操作 //程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放 //通过文件可以数据持久化 //c中对文件操作包含头文件<fstream> /…...
开源与在线 M3U8 Downloader 项目介绍及使用指南
M3U8 是一种用于播放列表格式的文件类型,广泛应用于流媒体服务中,特别是 HLS(HTTP Live Streaming)协议。它包含了一系列的 TS(Transport Stream)视频片段地址,使得视频能够分段加载,…...
正则表达式与文本处理器
正则表达式 基础正大表达式 查看特定字符 grep grep-n the test.txt grep-in the test.txt-n 显示行号 -i 不区分大小写 -v 反转查找 [] :中括号里可以写元素,内容符合任意元素,就会过滤出来 ^ :写在中括号里,代表取反。以^开头&…...
RedisTemplate方法一览表
数据类型RedisTemplate 方法Redis命令解释应用场景stringopsForValue().set(key, value)SET设置存储在指定 key 下的值存储简单数据,如用户的设置、配置项opsForValue().get(key)GET获取存储在指定 key 下的值读取存储的数据,如用户信息、配置参数opsFor…...
个人对devops的一点见解
DevOps 是一种将开发(Development)和运维(Operations)相结合的理念和实践方法。 它强调打破开发团队和运维团队之间的传统壁垒,促进两个团队之间更紧密的协作和沟通,以实现更高效、更快速、更可靠的软件交付…...
HarmonyOS鸿蒙应用开发基础知识
参考 HarmonyOS鸿蒙应用开发 (二、应用程序包结构理解及Ability的跳转,与Android的对比)_hap(harmonyos ability package)包的开发-CSDN博客 HarmonyOS NEXT下一代编程语言仓颉介绍及入门-CSDN博客...
Halcon 根据霍夫变换在图像中寻找直线
一 霍夫变换 1 定义 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一.几何形状包括圆,椭圆,直线等等. 2 直线方程 直线的方程可以用yk*xb 来表示,其中k和b是参数,分别是斜率和截距; 3 霍夫变换原理: 设…...
基于Openmv的追小球的云台
介绍 在这篇文章,我会先介绍需要用到且需要注意的函数,之后再给出整体代码 在追小球的云台中,比较重要的部分就是云台(实质上就是舵机)的控制以及对识别的色块位置进行处理得到相应信息后控制云台进行运动 1、舵机模…...
关于scrapy模块中setting.py文件的介绍
作用 在Scrapy框架中,settings.py 文件起着非常重要的作用,它用于配置和控制整个Scrapy爬虫项目的行为、性能和功能。 setting.py文件的介绍 # Scrapy settings for haodaifu project # # For simplicity, this file contains only settings consider…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
