代码随想录-Day49

300. 最长递增子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的
子序列

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4
示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1
在这里插入图片描述

class Solution {public int lengthOfLIS(int[] nums) {if (nums.length <= 1) return nums.length;int[] dp = new int[nums.length];int res = 1;Arrays.fill(dp, 1);for (int i = 1; i < dp.length; i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) {dp[i] = Math.max(dp[i], dp[j] + 1);}}res = Math.max(res, dp[i]);}return res;}
}

这段代码是用于解决「最长递增子序列」(Longest Increasing Subsequence, LIS)问题的Java实现。给定一个整数数组 nums,目标是找到其中最长的严格递增子序列的长度。这里所说的子序列是指原序列中删除一些或不删除元素且保持剩余元素的相对顺序不变形成的序列。

代码解析

  1. 边界情况处理:

    • 如果 nums 的长度小于等于1,那么最长递增子序列的长度就是数组的长度本身,因为单个元素或空数组本身就是递增的。
  2. 初始化动态规划数组:

    • 创建一个与 nums 长度相等的数组 dp,其中 dp[i] 代表以 nums[i] 结尾的最长递增子序列的长度。初始化 dp 数组的所有元素为1,因为至少每个元素自身都可以构成长度为1的递增子序列。
  3. 动态规划迭代:

    • 从数组的第二个元素开始迭代,对于每一个元素 nums[i](从索引1开始),遍历其前面的所有元素 nums[j](从索引0到 i-1)。
    • 如果当前元素 nums[i] 大于前面的某个元素 nums[j],那么可以尝试构建一个新的递增子序列,其长度为以 nums[j] 结尾的最长递增子序列的长度加1,即 dp[j] + 1
    • 更新 dp[i] 为所有可能的递增子序列长度中的最大值,这确保了 dp[i] 始终保存的是以 nums[i] 结尾的最长递增子序列的长度。
  4. 记录结果:

    • 在每次更新 dp[i] 后,同时更新全局最大值 res,以确保在整个迭代过程中始终保存最长递增子序列的长度。
  5. 返回结果:

    • 最后返回 res,即整个数组中的最长递增子序列的长度。

时间复杂度和空间复杂度

  • 时间复杂度: O(n^2),其中 n 是数组 nums 的长度。这是因为对于数组中的每个元素,都需要遍历其前面的所有元素来计算最长递增子序列的长度。
  • 空间复杂度: O(n),需要一个长度为 n 的动态规划数组 dp 来存储中间结果。

总结

这段代码通过动态规划的方法,有效地解决了最长递增子序列问题。尽管时间复杂度为 O(n^2),但在许多实际应用场景中,这样的性能通常是可接受的。如果需要更高效的算法(如 O(n log n) 的时间复杂度),则可以采用更复杂的算法,例如结合二分查找的优化版本。

674. 最长连续递增序列

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], …, nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1:

输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。
示例 2:

输入:nums = [2,2,2,2,2]
输出:1
解释:最长连续递增序列是 [2], 长度为1。
在这里插入图片描述

方法一:动态规划

 /*** 1.dp[i] 代表当前下标最大连续值* 2.递推公式 if(nums[i+1]>nums[i]) dp[i+1] = dp[i]+1* 3.初始化 都为1* 4.遍历方向,从其那往后* 5.结果推导 。。。。* @param nums* @return*/public static int findLengthOfLCIS(int[] nums) {int[] dp = new int[nums.length];for (int i = 0; i < dp.length; i++) {dp[i] = 1;}int res = 1;//可以注意到,這邊的 i 是從 0 開始,所以會出現和卡哥的C++ code有差異的地方,在一些地方會看到有 i + 1 的偏移。for (int i = 0; i < nums.length - 1; i++) {if (nums[i + 1] > nums[i]) {dp[i + 1] = dp[i] + 1;}res = res > dp[i + 1] ? res : dp[i + 1];}return res;}

这段代码是用于解决「最长连续递增序列」(Longest Continuous Increasing Subsequence, LCIS)问题的Java实现。给定一个整数数组 nums,目标是找到其中最长的连续严格递增序列的长度。

代码解析

  1. 初始化动态规划数组:

    • 创建一个与 nums 长度相等的数组 dp,其中 dp[i] 代表以 nums[i] 结尾的最长连续递增序列的长度。初始化 dp 数组的所有元素为1,因为至少每个元素自身都可以构成长度为1的连续递增序列。
  2. 动态规划迭代:

    • 从数组的第一个元素开始迭代,直到倒数第二个元素(因为需要比较当前元素与其下一个元素的关系),对于每一个元素 nums[i](从索引0开始到 nums.length - 2)。
    • 如果当前元素 nums[i] 小于其下一个元素 nums[i + 1],那么可以构建一个新的连续递增序列,其长度为以 nums[i] 结尾的最长连续递增序列的长度加1,即 dp[i] + 1
    • 更新 dp[i + 1] 为这个新的连续递增序列的长度。
  3. 记录结果:

    • 在每次更新 dp[i + 1] 后,同时更新全局最大值 res,以确保在整个迭代过程中始终保存最长连续递增序列的长度。
  4. 返回结果:

    • 最后返回 res,即整个数组中的最长连续递增序列的长度。

特别注意

在迭代过程中,由于 dp 数组的更新是基于前一个元素的值,因此迭代的方向是从前往后,这确保了在更新 dp[i + 1] 时,dp[i] 已经包含了正确的信息。

时间复杂度和空间复杂度

  • 时间复杂度: O(n),其中 n 是数组 nums 的长度。这是因为只需要遍历数组一次来计算最长连续递增序列的长度。
  • 空间复杂度: O(n),需要一个长度为 n 的动态规划数组 dp 来存储中间结果。

总结

这段代码通过动态规划的方法,有效地解决了最长连续递增序列问题。相比于最长递增子序列问题,最长连续递增序列问题的时间复杂度更低,因为不需要对每个元素都进行前面所有元素的比较,只需关注相邻元素之间的关系。

方法二:动态规划状态压缩

class Solution {public int findLengthOfLCIS(int[] nums) {// 记录以 前一个元素结尾的最长连续递增序列的长度 和 以当前 结尾的......int beforeOneMaxLen = 1, currentMaxLen = 0;// res 赋最小值返回的最小值1int res = 1;for (int i = 1; i < nums.length; i ++) {currentMaxLen = nums[i] > nums[i - 1] ? beforeOneMaxLen + 1 : 1;beforeOneMaxLen = currentMaxLen;res = Math.max(res, currentMaxLen);}return res;}
}

这段代码是解决「最长连续递增序列」(Longest Continuous Increasing Subsequence, LCIS)问题的另一种高效实现,它采用了空间优化的动态规划方法。给定一个整数数组 nums,目标是找到其中最长的连续严格递增序列的长度。

代码解析

  1. 初始化变量:

    • beforeOneMaxLen:表示以当前元素的前一个元素结尾的最长连续递增序列的长度。
    • currentMaxLen:表示以当前元素结尾的最长连续递增序列的长度。初始化时,这个变量没有实际意义,因为真正的计算在循环中进行。
    • res:用于记录整个数组中的最长连续递增序列的长度,初始化为1,因为至少每个元素自身都可以构成长度为1的连续递增序列。
  2. 动态规划迭代:

    • 从数组的第二个元素开始迭代,对于每一个元素 nums[i](从索引1开始到 nums.length - 1)。
    • 如果当前元素 nums[i] 大于其前一个元素 nums[i - 1],那么可以构建一个新的连续递增序列,其长度为以 nums[i - 1] 结尾的最长连续递增序列的长度加1,即 beforeOneMaxLen + 1
    • 如果当前元素不大于其前一个元素,那么以当前元素结尾的最长连续递增序列的长度重置为1,因为连续递增被中断,新的连续递增序列从当前元素开始。
    • 更新 beforeOneMaxLencurrentMaxLen,以准备下一次迭代。
  3. 记录结果:

    • 在每次更新 currentMaxLen 后,同时更新全局最大值 res,以确保在整个迭代过程中始终保存最长连续递增序列的长度。
  4. 返回结果:

    • 最后返回 res,即整个数组中的最长连续递增序列的长度。

特别注意

与之前版本相比,这段代码在空间复杂度上进行了优化,不再需要一个与输入数组相同长度的动态规划数组 dp,而是仅使用几个变量来保存必要的状态信息,这大大减少了空间占用。

时间复杂度和空间复杂度

  • 时间复杂度: O(n),其中 n 是数组 nums 的长度。这是因为只需要遍历数组一次来计算最长连续递增序列的长度。
  • 空间复杂度: O(1),仅使用了固定数量的变量,与输入数组的大小无关。

总结

这段代码通过动态规划的方法,有效地解决了最长连续递增序列问题,同时在空间复杂度方面进行了优化,使得算法更加高效。相比于传统的动态规划实现,这种空间优化的方法在处理大规模数据时表现更佳。

方法三:贪心法

public static int findLengthOfLCIS(int[] nums) {if (nums.length == 0) return 0;int res = 1; // 连续子序列最少也是1int count = 1;for (int i = 0; i < nums.length - 1; i++) {if (nums[i + 1] > nums[i]) { // 连续记录count++;} else { // 不连续,count从头开始count = 1;}if (count > res) res = count;}return res;
}

这段代码是解决「最长连续递增序列」(Longest Continuous Increasing Subsequence, LCIS)问题的简洁实现。给定一个整数数组 nums,目标是找到其中最长的连续严格递增序列的长度。

代码解析

  1. 边界情况处理:

    • 如果 nums 的长度为0,那么最长连续递增序列的长度自然为0。
  2. 初始化变量:

    • res:用于记录整个数组中的最长连续递增序列的长度,初始化为1,因为至少每个元素自身都可以构成长度为1的连续递增序列。
    • count:表示当前正在统计的连续递增序列的长度,初始化为1。
  3. 动态检查与更新:

    • 从数组的第一个元素开始迭代,直到倒数第二个元素,对于每一个元素 nums[i](从索引0开始到 nums.length - 2)。
    • 如果当前元素 nums[i] 小于其下一个元素 nums[i + 1],那么当前正在统计的连续递增序列的长度 count 加1。
    • 如果当前元素不小于其下一个元素,那么当前连续递增序列被中断,count 重置为1,从下一个元素重新开始统计新的连续递增序列的长度。
  4. 记录结果:

    • 在每次更新 count 后,同时更新全局最大值 res,以确保在整个迭代过程中始终保存最长连续递增序列的长度。
  5. 返回结果:

    • 最后返回 res,即整个数组中的最长连续递增序列的长度。

时间复杂度和空间复杂度

  • 时间复杂度: O(n),其中 n 是数组 nums 的长度。这是因为只需要遍历数组一次来计算最长连续递增序列的长度。
  • 空间复杂度: O(1),仅使用了固定数量的变量,与输入数组的大小无关。

总结

这段代码通过简单直观的方式,有效地解决了最长连续递增序列问题。相比于使用动态规划数组的传统方法,这段代码不仅易于理解和实现,而且在空间复杂度方面表现出色,仅使用了几个变量,非常适合处理大规模数据集。此外,这种方法避免了动态规划中可能存在的冗余计算,提高了算法的效率。

718. 最长重复子数组

给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。

示例 1:

输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
输出:3
解释:长度最长的公共子数组是 [3,2,1] 。
示例 2:

输入:nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]
输出:5
在这里插入图片描述

方法一:

// 版本一
class Solution {public int findLength(int[] nums1, int[] nums2) {int result = 0;int[][] dp = new int[nums1.length + 1][nums2.length + 1];for (int i = 1; i < nums1.length + 1; i++) {for (int j = 1; j < nums2.length + 1; j++) {if (nums1[i - 1] == nums2[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + 1;result = Math.max(result, dp[i][j]);}}}return result;}
}

这段代码是用于解决「两个数组的最长相同子数组」问题的Java实现。给定两个整数数组 nums1nums2,目标是找到在这两个数组中都出现的最长连续相同子数组的长度。

代码解析

  1. 初始化动态规划数组:

    • 创建一个二维数组 dp,其大小为 (nums1.length + 1) x (nums2.length + 1)dp[i][j] 的值代表以 nums1[i-1]nums2[j-1] 结尾的最长连续相同子数组的长度。额外的一列和一行是为了方便边界条件的处理。
  2. 动态规划迭代:

    • 从数组的第一个有效元素开始迭代,对于每一个元素 nums1[i-1]nums2[j-1](从索引1开始到 nums1.lengthnums2.length)。
    • 如果 nums1[i-1] 等于 nums2[j-1],那么以它们结尾的最长连续相同子数组的长度等于以它们的前一个元素结尾的最长连续相同子数组的长度加1,即 dp[i-1][j-1] + 1
    • 如果两个元素不相等,那么 dp[i][j] 的值为0,因为当前元素不能扩展任何一个连续相同子数组。
  3. 记录结果:

    • 在每次更新 dp[i][j] 后,同时更新全局最大值 result,以确保在整个迭代过程中始终保存最长连续相同子数组的长度。
  4. 返回结果:

    • 最后返回 result,即两个数组中都出现的最长连续相同子数组的长度。

时间复杂度和空间复杂度

  • 时间复杂度: O(m * n),其中 m 和 n 分别是数组 nums1nums2 的长度。这是因为需要遍历两个数组的所有可能的元素组合来计算最长连续相同子数组的长度。
  • 空间复杂度: O(m * n),需要一个大小为 (m + 1) x (n + 1) 的动态规划数组 dp 来存储中间结果。

总结

这段代码通过动态规划的方法,有效地解决了两个数组的最长相同子数组问题。尽管时间复杂度和空间复杂度较高,但在许多实际应用场景中,这样的性能通常是可接受的,特别是当数组大小适中时。如果需要进一步优化空间复杂度,可以考虑使用滚动数组技术,将空间复杂度降低到 O(min(m, n))。

方法二:

// 版本二: 滚动数组
class Solution {public int findLength(int[] nums1, int[] nums2) {int[] dp = new int[nums2.length + 1];int result = 0;for (int i = 1; i <= nums1.length; i++) {for (int j = nums2.length; j > 0; j--) {if (nums1[i - 1] == nums2[j - 1]) {dp[j] = dp[j - 1] + 1;} else {dp[j] = 0;}result = Math.max(result, dp[j]);}}return result;}
}

这段代码是用于解决「两个数组的最长相同子数组」问题的Java实现,特别之处在于它使用了滚动数组技术来优化空间复杂度。给定两个整数数组 nums1nums2,目标是找到在这两个数组中都出现的最长连续相同子数组的长度。

代码解析

  1. 初始化动态规划数组:

    • 创建一个一维数组 dp,其大小为 nums2.length + 1dp[j] 的值代表以 nums1[i-1]nums2[j-1] 结尾的最长连续相同子数组的长度,其中 i 是外层循环的索引。额外的一列是为了方便边界条件的处理。
  2. 动态规划迭代:

    • 外层循环从1到 nums1.length 遍历 nums1 的每个元素。
    • 内层循环从 nums2.length 反向遍历到1,对于每个 nums2[j-1]
    • 如果 nums1[i-1] 等于 nums2[j-1],那么以它们结尾的最长连续相同子数组的长度等于以 nums2[j-2] 结尾的最长连续相同子数组的长度加1,即 dp[j - 1] + 1
    • 如果两个元素不相等,那么 dp[j] 的值为0。
    • 注意内层循环从后向前遍历的原因是为了避免在更新 dp[j] 的时候影响到尚未处理的 dp[j-1] 的值,因为外层循环中的 i 不断增加,而内层循环中的 j 不断减少,这样可以确保 dp[j-1] 总是保留着前一个状态的正确值。
  3. 记录结果:

    • 在每次更新 dp[j] 后,同时更新全局最大值 result,以确保在整个迭代过程中始终保存最长连续相同子数组的长度。
  4. 返回结果:

    • 最后返回 result,即两个数组中都出现的最长连续相同子数组的长度。

时间复杂度和空间复杂度

  • 时间复杂度: O(m * n),其中 m 和 n 分别是数组 nums1nums2 的长度。这是因为需要遍历两个数组的所有可能的元素组合来计算最长连续相同子数组的长度。
  • 空间复杂度: O(n),其中 n 是 nums2 的长度。使用了一维数组 dp 来存储中间结果,相比于版本一的二维数组,空间复杂度显著降低。

总结

这段代码通过滚动数组的动态规划方法,有效地解决了两个数组的最长相同子数组问题,同时在空间复杂度方面进行了优化。滚动数组技术避免了使用额外的大量空间,使得算法在处理大规模数据时更加高效。

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

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

相关文章

【话题】AI是在帮助开发者还是取代他们

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 引言AI在代码生成中的应用AI在错误检测和自动化测试中的作用对开发者职业前景的影响技能需求的变化与适应策略结论文章推荐 引言 随着人工智能&#xff08;AI&#xff…

接口测试工具Postman

Postman Postman介绍 开发API后&#xff0c;用于API测试的工具。在我们平时开发中&#xff0c;特别是需要与接口打交道时&#xff0c;无论是写接口还是用接口&#xff0c;拿到接口后肯定都得提前测试一下。在开发APP接口的过程中&#xff0c;一般接口写完之后&#xff0c;后端…

【最新整理】全国高校本科及专科招生和毕业数据集(2008-2022年)

整理了各省高校本科、专科招生和毕业数据等21个相关指标&#xff0c;包括招生、在校、毕业人数&#xff0c;以及财政教育支出、教育经费等数据。含原始数据、线性插值、回归填补三个版本&#xff0c;希望对大家有所帮助 一、数据介绍 数据名称&#xff1a;高校本科、专科招生…

JWT(Json Web Token)在.NET Core中的使用

登录成功时生成JWT字符串目录 JWT是什么&#xff1f; JWT的优点&#xff1a; JWT在.NET Core 中的使用 JWT是什么&#xff1f; JWT把登录信息&#xff08;也称作令牌&#xff09;保存在客户端为了防止客户端的数据造假&#xff0c;保存在客户端的令牌经过了签名处理&#xf…

LT8712 支持USB Type-C的DP到HDMI/VGA 用于对接站 适配器

描述 LT8712是一个DisplayPort(DP)到HDMI和VGA转换器&#xff0c;设计用于同时连接一个DP源到一个VGA收发器和最多两个HDMI收发器。LT8712集成了一个DP1.2兼容的接收器、一个高速三通道视频DAC和两个HDMI1.4兼容的发射器(发射器0和发射器1)。接收端口集成了CC控制器&#xff0c…

html+js+css做的扫雷

做了个扫雷&#x1f4a3; 88大小 源代码在文章最后 界面 先点击蓝色开局按钮 然后就可以再扫雷的棋盘上玩 0代表该位置没有雷 其他数字代表周围雷的数量 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8&qu…

价格预言机的使用总结(一):Chainlink篇

文章首发于公众号&#xff1a;Keegan小钢 前言 价格预言机已经成为了 DeFi 中不可获取的基础设施&#xff0c;很多 DeFi 应用都需要从价格预言机来获取稳定可信的价格数据&#xff0c;包括借贷协议 Compound、AAVE、Liquity &#xff0c;也包括衍生品交易所 dYdX、PERP 等等。…

【腾讯内推】腾讯2025校招/青云计划/社招——长期有效

及时跟进进度&#xff0c;保证不让简历石沉大海&#xff01; 涵盖NLP/CV/CG/ML/多模态/数据科学/多媒体等各方向! 定向匹配优质团队/竞争力薪酬/覆盖全球工作地点! 招聘对象: 本硕博:2024年1月-2025年12月毕业的同学 目前最热岗位: 技术研究-自然语言处理 技术研究-计算机视觉 …

【Linux】进程创建和终止 | slab分配器

进程创建 fork 1.fork 之后发生了什么 将给子进程分配新的内存块和内核数据结构&#xff08;形成了新的页表映射&#xff09;将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork 返回&#xff0c;开始调度器调度 这样就可以回答之前返回两个值&#xff1f…

Java面试八股之MySQL存储货币数据,用什么类型合适

MySQL存储货币数据&#xff0c;用什么类型合适 在MySQL中存储货币数据&#xff0c;最合适的类型是DECIMAL。这是因为货币数据通常需要高精度&#xff0c;尤其是对于财务交易&#xff0c;即使是极小的精度损失也可能导致严重的会计错误。DECIMAL类型可以提供固定的精度&#xf…

c++:struct和class的区别

C和C中struct的区别 (1)C中不支持成员函数&#xff08;只能通过函数指针成员变量间接支持&#xff09;&#xff0c;而C源生支持。 (2)C中不支持static成员&#xff0c;而C中支持。后面会详细讲&#xff0c;C static class是一个大知识点 (3)访问权限&#xff0c;C中默认public…

利用 Hexo 搭建个人博客

〇、前言 本文将会讨论&#xff0c;如何将 CSDN 上的博客&#xff0c;拉取到本地&#xff0c;然后PicGo、Hexo、Github 等工具建立个人博客&#xff0c;环境为 Ubuntu 20.04。 一、利用 Hexo 预备工作 首先安装 Node.js、npm、git工具。 > node -v v12.22.9 > npm -…

Midjourney 预设

使用命令/settings 进入预设,根据点击不同选项来配置。 🌹 1. 设置工作所使用的模型版本。 1️⃣ MJ Version 1 2️⃣ MJ Version 2 3️⃣ MJ Version 3 4️⃣ MJ Version 4 5️⃣ MJ Version 5 5️⃣ MJ Version 5.1 🔧Raw Mode 🌈 Niji Version 4 🍎 Niji Versio…

深入探索C语言中的结构体:定义、特性与应用

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 目录 结构体的介绍结构体定义结构成员的类型结构体变量的定义和初始化结构体成员的访问结构体传参 结构体的介绍 在C语言中&#xff0c;结构体是一种用户自定义的数据类型&#xff0c;它允许开发者将不同类型的变量组合在一起…

数据库管理工具 -- Navicat Premium v17.0.8 特别版

软件简介 Navicat Premium 是一款功能强大的数据库管理工具&#xff0c;适用于Windows、Mac和Linux平台。它支持多种数据库&#xff0c;包括MySQL、MariaDB、SQL Server、PostgreSQL、Oracle、SQLite等。用户可以通过Navicat Premium轻松地连接到各种数据库服务器&#xff0c;…

ASP.NET Core----基础学习02----中间件的执行顺序 静态文件中间件

文章目录 1.终端中间件&#xff08;Middleware&#xff09;2.中间件的执行顺序&#xff08;1&#xff09;当只有2个中间件的时候&#xff0c;先执行普通中间件&#xff0c;再执行终端中间件&#xff08;2&#xff09;当有多个中间件的时候&#xff0c;中间件的执行顺序 3.添加静…

接口自动化测试思路和实战(5):【推荐】混合测试自动化框架(关键字+数据驱动)

混合测试自动化框架(关键字数据驱动) 关键字驱动或表驱动的测试框架 这个框架需要开发数据表和关键字。这些数据表和关键字独立于执行它们的测试自动化工具&#xff0c;并可以用来“驱动&#xff02;待测应用程序和数据的测试脚本代码&#xff0c;关键字驱动测试看上去与手工测…

Nacos服务注册总流程(源码分析)

文章目录 服务注册NacosClient找看源码入口NacosClient服务注册源码NacosServer处理服务注册 服务注册 服务注册 在线流程图 NacosClient找看源码入口 我们启动一个微服务&#xff0c;引入nacos客户端的依赖 <dependency><groupId>com.alibaba.cloud</groupI…

免密ssh和自定义服务器名字【远程连接服务器】

免密ssh和自定义服务器名字【远程连接服务器】 免密ssh和自定义服务器名字【远程连接服务器】服务器添加本地公钥ssh-copy-id使用别名登录config 免密ssh和自定义服务器名字【远程连接服务器】 原理 实现免密登录需要 本地的公钥id_rsa.pub放在服务器上的 authorized_keys 文件…

Linux 防火墙配置指南:firewalld 端口管理应用案例(二十个实列)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;&#x1f427;Linux高级管理专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️…