怒刷LeetCode的第19天(Java版)

目录

第一题

题目来源

题目内容

解决方法

方法一:遍历一次数组

方法二:贪心算法

方法三:双指针

第二题

题目来源

题目内容

解决方法

方法一:动态规划

方法二:贪婪算法

方法三:正则表达式

第三题

题目来源

题目内容

解决方法

方法一:贪心算法

方法二:动态规划

方法三:广度优先搜索

方法四:逆向贪婪算法



第一题

题目来源

605. 种花问题 - 力扣(LeetCode)

题目内容

解决方法

方法一:遍历一次数组

该问题的思路与算法如下:

  1. 初始化一个计数器count为0,用于记录可以种植花的数量。
  2. 遍历花坛数组,检查每个位置是否可以种植花。
    • 如果当前位置为0,且其相邻的两个位置也为0(或者是边界情况),则该位置可以种植花。将该位置设为1,计数器count加1。
  3. 遍历结束后,判断计数器count的值是否大于等于n。
    • 如果是,则表示可以种入n朵花,返回true。
    • 如果不是,则表示不能种入n朵花,返回false。

这个思路的关键在于遍历花坛数组,检查每个位置是否满足种植花的条件。需要注意边界情况的处理,即第一个位置和最后一个位置的相邻位置的判断条件略有不同。通过遍历一次数组,可以快速判断能否种入n朵花。时间复杂度为O(n),其中n为花坛数组的长度。

class Solution {
public static boolean canPlaceFlowers(int[] flowerbed, int n) {int count = 0;int length = flowerbed.length;int i = 0;while (i < length) {if (flowerbed[i] == 0 && (i == 0 || flowerbed[i - 1] == 0) && (i == length - 1 || flowerbed[i + 1] == 0)) {flowerbed[i] = 1;count++;}i++;if (count >= n) {return true;}}return false;}
}

复杂度分析:

  • 时间复杂度:遍历一次花坛数组,对于每个位置最多访问其相邻的两个位置,因此时间复杂度为O(n),其中n为花坛数组的长度。
  • 空间复杂度:该算法只使用了常数个变量,因此空间复杂度为O(1)。

综上所述,该算法的时间复杂度为O(n),空间复杂度为O(1)。

LeetCode运行结果:

方法二:贪心算法

除了遍历数组的解法,还可以使用贪心算法来解决这个问题。具体思路是:从左到右遍历花坛数组,如果当前位置为0且其相邻的左右位置都是0,则在该位置种植花,并将计数器加1;如果当前位置为1,则直接跳到下一个位置。

使用贪心算法的好处在于避免了对整个数组的遍历,而是仅仅关注每个位置是否能够种植花。这样可以优化时间复杂度,使得算法的运行时间更快。

class Solution {
public static boolean canPlaceFlowers(int[] flowerbed, int n) {int count = 0;int i = 0;while (i < flowerbed.length) {if (flowerbed[i] == 0 && (i == 0 || flowerbed[i - 1] == 0) && (i == flowerbed.length - 1 || flowerbed[i + 1] == 0)) {flowerbed[i] = 1;count++;}i++;}return count >= n;}
}

复杂度分析:

  • 时间复杂度: 这个解法只需要遍历一次花坛数组,对于每个位置最多访问其相邻的两个位置。因此,时间复杂度为 O(n),其中 n 是花坛数组的长度。
  • 空间复杂度: 该解法只使用了常数个变量,所以空间复杂度为 O(1)。

综上所述,使用贪心算法的解法的时间复杂度为 O(n),空间复杂度为 O(1)。与遍历数组的解法相比,在时间复杂度上并无区别,但是在代码实现上更简洁。

LeetCode运行结果:

方法三:双指针

除了遍历数组、贪心算法,还可以使用双指针来解决这个问题。

具体思路是使用两个指针,一个指向当前位置,一个指向前一个位置。从左到右遍历花坛数组,如果当前位置为0且前一个位置和后一个位置都是0,则在该位置种植花,并将计数器加1。然后将两个指针向后移动两位,继续遍历下一个位置。

class Solution {
public static boolean canPlaceFlowers(int[] flowerbed, int n) {int count = 0;int i = 0;while (i < flowerbed.length) {if (flowerbed[i] == 0 && (i == 0 || flowerbed[i - 1] == 0) && (i == flowerbed.length - 1 || flowerbed[i + 1] == 0)) {flowerbed[i] = 1;count++;i += 2;} else {i++;}}return count >= n;}
}

复杂度分析:

  • 时间复杂度:O(n),其中n为花坛数组的长度。
  • 空间复杂度:O(1),只需要常数级别的额外空间存储临时变量。

与贪心算法相比,在思路上稍微有所不同,但在时间复杂度和空间复杂度上相同。

LeetCode运行结果:

第二题

题目来源

44. 通配符匹配 - 力扣(LeetCode)

题目内容

解决方法

方法一:动态规划

这个问题可以使用动态规划的思路来解决。

我们可以定义一个二维布尔数组dp,其中dp[i][j]表示字符串s的前i个字符和模式串p的前j个字符是否匹配。

接下来我们分析状态转移的情况:

  1. 当s的第i个字符和p的第j个字符相等或者p的第j个字符为'?'时,dp[i][j]的值取决于dp[i-1][j-1],即s的前i-1个字符和p的前j-1个字符是否匹配。
  2. 当p的第j个字符为'*'时,dp[i][j]的值可以从dp[i][j-1]或dp[i-1][j]转移而来:
    • dp[i][j-1]表示'*'匹配了空字符,此时dp[i][j]的值取决于dp[i][j-1];
    • dp[i-1][j]表示'*'匹配了s的第i个字符,此时dp[i][j]的值取决于dp[i-1][j]。

根据以上分析,我们可以得到动态规划的状态转移方程:

if (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?') {dp[i][j] = dp[i - 1][j - 1];
} else if (p.charAt(j - 1) == '*') {dp[i][j] = dp[i][j - 1] || dp[i - 1][j];
}

边界情况:

  • dp[0][0]表示空字符和空字符完全匹配,初始化为true;
  • dp[0][j]表示空字符和模式串p的前j个字符匹配的情况。若p的第j个字符为'*',则dp[0][j]的值取决于dp[0][j-1];否则为false;
  • dp[i][0]表示字符串s的前i个字符和空字符匹配的情况,都为false。

最终,我们返回dp[m][n],即字符串s的全部字符和模式串p的全部字符是否完全匹配。

class Solution {public boolean isMatch(String s, String p) {int m = s.length(), n = p.length();boolean[][] dp = new boolean[m + 1][n + 1];dp[0][0] = true;// 处理 p 以 * 开头的情况for (int j = 1; j <= n; j++) {if (p.charAt(j - 1) == '*') {dp[0][j] = true;} else {break;}}for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?') {dp[i][j] = dp[i - 1][j - 1];} else if (p.charAt(j - 1) == '*') {dp[i][j] = dp[i][j - 1] || dp[i - 1][j];}}}return dp[m][n];}
}

复杂度分析:

对于给定长度为m的字符串s和长度为n的模式串p,动态规划解法的时间复杂度为O(mn),空间复杂度也为O(mn)。

在计算过程中,我们需要填充一个大小为(m+1)×(n+1)的二维dp数组。每个位置的填充操作需要常数时间,因此总的时间复杂度为O(m*n)。

同时,我们只使用一个二维dp数组来存储中间结果,所以空间复杂度也是O(m*n)。

需要注意的是,这里的m和n并不是指s和p的最大长度,而是分别表示s和p实际的长度加1。这是因为我们在填充dp数组时,需要考虑到空字符和空模式串的情况。

总结起来,该解法具有较优的时间和空间复杂度,适用于处理规模较小的字符串匹配问题。

LeetCode运行结果:

方法二:贪婪算法

除了动态规划,还可以使用贪婪算法进行字符串匹配。贪婪算法通常是一种基于局部最优选择的策略,在某些情况下可以得到快速且有效的解。具体到字符串匹配问题,我们可以通过迭代遍历的方式来实现贪婪算法。

该贪婪算法的思路是一次处理字符串s和模式串p的一个字符,根据当前的字符匹配情况进行不同操作:

  • 若两个字符相等或者模式串p的当前字符为'?',则两个索引都向后移动;
  • 若模式串p的当前字符为'*',记录当前位置,并只移动模式串的索引;
  • 若当前字符不匹配,但之前出现过''的情况,回溯到''匹配的下一个位置,并将字符串索引+1;
  • 若没有之前出现过'*'的情况,则匹配失败。
  • 最后需要处理模式串p末尾的多余字符,判断是否全部为'*'。

该贪婪算法在某些情况下可以得到快速的解,但并不适用于所有的字符串匹配问题。在一些特殊的模式串情况下,可能会导致错误的匹配结果。因此,在实际应用中,需要根据具体情况选择合适的解法。

class Solution {public boolean isMatch(String s, String p) {int sIndex = 0; // 字符串s的索引int pIndex = 0; // 模式串p的索引int matchIndex = -1; // 最近一次出现'*'匹配的位置int starIndex = -1; // 最近一次出现'*'的位置while (sIndex < s.length()) {// 当两个字符相等或模式串为'?'时,两个索引都向后移动if (pIndex < p.length() && (s.charAt(sIndex) == p.charAt(pIndex) || p.charAt(pIndex) == '?')) {sIndex++;pIndex++;}// 当模式串为'*'时,记录当前位置,并只移动模式串的索引else if (pIndex < p.length() && p.charAt(pIndex) == '*') {starIndex = pIndex;matchIndex = sIndex;pIndex++;}// 当前字符不匹配,但有之前出现过'*'的情况,回溯到'*'匹配的下一个位置,并将字符串索引+1else if (starIndex != -1) {pIndex = starIndex + 1;matchIndex++;sIndex = matchIndex;}// 当没有之前出现过'*'的情况,返回falseelse {return false;}}// 处理模式串末尾的多余字符while (pIndex < p.length() && p.charAt(pIndex) == '*') {pIndex++;}// 字符串s和模式串p都遍历完毕,则匹配成功return pIndex == p.length();}
}

复杂度分析:

设字符串 s 的长度为 n,模式串 p 的长度为 m。

  • 在最坏情况下(即没有匹配的字符和通配符时),两个索引 sIndex 和 pIndex 都要遍历整个字符串 s 和模式串 p。 时间复杂度为 O(n+m)。
  • 在处理通配符 '*' 时,如果出现回溯的情况,需要在每次回溯时移动 pIndex 和 matchIndex,直到找到匹配的字符位置。 由于每次回溯都会移动 sIndex,所以总共只会有 n 次回溯操作。 因此,在最坏情况下,回溯操作的时间复杂度为 O(n)。
  • 在处理模式串末尾的多余字符时,需要遍历剩余的模式串字符。 时间复杂度为 O(m-pIndex)。

综上所述,代码的总体时间复杂度为 O(n+m),空间复杂度为 O(1)。

LeetCode运行结果:

方法三:正则表达式
class Solution {public boolean isMatch(String s, String p) {String regex = p.replace("?", ".").replace("*", ".*");return s.matches(regex);}
}

这个实现使用了 Java 的正则表达式来处理通配符匹配。首先,将模式串 p 中的 '?' 替换成 '.',将 '' 替换成 '.',得到一个新的正则表达式 regex。

然后,使用字符串 s 的 matches() 方法,测试字符串 s 是否能够匹配正则表达式 regex。如果能够匹配,则返回 true,否则返回 false。

需要注意的是,该方法只是一种简单的通配符匹配算法,可能无法处理一些复杂的情况。在实际应用中,需要根据需求选择更加高效和精确的算法。

复杂度分析:

  • 时间复杂度分析:使用正则表达式的 matches() 方法进行匹配,具体的实现和性能取决于底层正则引擎。一般情况下,时间复杂度为 O(M*N),其中 M 是模式串 p 的长度,N 是字符串 s 的长度。
  • 空间复杂度分析:空间复杂度取决于正则表达式的匹配过程中是否需要生成匹配结果的存储。在 Java 的 matches() 方法中,会将整个匹配结果存储在内存中,并返回一个 boolean 值表示是否匹配成功。因此,空间复杂度为 O(M*N),其中 M 是模式串 p 的长度,N 是字符串 s 的长度。

LeetCode运行结果:

第三题

题目来源

45. 跳跃游戏 II - 力扣(LeetCode)

题目内容

解决方法

方法一:贪心算法
class Solution {public int jump(int[] nums) {if (nums.length <= 1) {return 0;}int maxReach = nums[0]; // 当前能够到达的最远位置int steps = nums[0]; // 当前步数内能够到达的最远位置int jumps = 1; // 跳跃次数for (int i = 1; i < nums.length; i++) {// 如果当前位置超过了最远位置,需要进行一次跳跃if (i > maxReach) {jumps++;maxReach = steps;}// 更新当前步数内能够到达的最远位置steps = Math.max(steps, i + nums[i]);}return jumps;}
}

在这个实现中,我们使用贪心算法来寻找最优解。我们定义三个变量:

  • maxReach:当前能够到达的最远位置
  • steps:当前步数内能够到达的最远位置
  • jumps:跳跃次数

我们从索引 1 开始遍历数组,每次更新 steps 的值为当前位置加上当前元素的值。如果当前位置超过了 maxReach,说明我们需要进行一次跳跃,此时将 jumps 加 1,并更新 maxReach 为 steps。

最终,返回 jumps 的值即为到达最后一个位置的最小跳跃次数。

复杂度分析:

  • 时间复杂度是 O(n),其中 n 是数组 nums 的长度。这是因为我们只需要遍历一次数组,每次遍历都更新跳跃的最远位置和步数内能够到达的最远位置。
  • 空间复杂度是 O(1),即常数级别的额外空间。这是因为我们只使用了几个变量来保存最远位置、步数和跳跃次数,没有使用额外的数组或数据结构。

因此,该算法是一个高效的解决方案,可以在给定的约束条件下快速求解跳跃游戏问题。

LeetCode运行结果:

方法二:动态规划

除了贪心算法,还可以使用动态规划来解决跳跃游戏 II 问题。

class Solution {public int jump(int[] nums) {int n = nums.length;int[] dp = new int[n]; // dp[i] 表示到达第 i 个位置所需的最小跳跃次数Arrays.fill(dp, Integer.MAX_VALUE);dp[0] = 0;for (int i = 0; i < n; i++) {int maxJump = nums[i]; // 当前位置能够跳跃的最大长度for (int j = 1; j <= maxJump && i + j < n; j++) {dp[i + j] = Math.min(dp[i + j], dp[i] + 1);}}return dp[n - 1];}
}

在这个实现中,我们首先创建一个长度为 n 的数组 dp,用于保存到达每个位置所需的最小跳跃次数。初始化 dp[0] 为 0,其它位置的值都设置为一个较大的数,表示初始状态为无穷大。

然后,我们从左向右遍历数组 nums,对于每个位置 i,将当前位置能够跳跃的最大长度 nums[i] 内的所有位置的 dp 值更新为 dp[i] + 1,表示通过当前位置 i 进行一次跳跃。

最终,返回 dp[n - 1] 的值即为到达最后一个位置的最小跳跃次数。

该算法的时间复杂度是 O(n^2),其中 n 是数组 nums 的长度。因为我们需要遍历每个位置,并且对于每个位置,还需要遍历当前位置能够跳跃的最大长度内的所有位置。

复杂度分析:

  • 时间复杂度是 O(n^2),其中 n 是数组 nums 的长度。这是因为我们需要遍历每个位置,并对于每个位置,还需要遍历当前位置能够跳跃的最大长度内的所有位置。
  • 空间复杂度是 O(n),即额外使用了一个数组 dp 来保存最小跳跃次数。这是因为我们需要存储到达每个位置所需的最小跳跃次数。

虽然动态规划解法的时间复杂度较高,但它提供了一种通用的解决方法,适用于各种求解最优解问题的场景。在实际应用中,可以根据输入规模和实际需求来选择贪心算法或动态规划来解决跳跃游戏问题。如果输入规模较小,动态规划算法的性能可能会比较好;如果输入规模较大,贪心算法可能会更加高效。

LeetCode运行结果:

方法三:广度优先搜索

除了贪婪算法和动态规划之外,还有一种常见的解决方法是使用广度优先搜索(BFS)。

import java.util.LinkedList;
import java.util.Queue;class Solution {public int jump(int[] nums) {int n = nums.length;if (n == 1) {return 0; // 如果数组长度为 1,则不需要跳跃}Queue<Integer> queue = new LinkedList<>(); // 用于保存当前位置的队列boolean[] visited = new boolean[n]; // 记录每个位置是否已访问visited[0] = true;queue.offer(0); // 将起始位置加入队列int step = 0; // 跳跃的次数while (!queue.isEmpty()) {int size = queue.size();for (int i = 0; i < size; i++) {int currIndex = queue.poll();int maxJump = nums[currIndex];for (int j = 1; j <= maxJump; j++) {int nextIndex = currIndex + j;if (nextIndex >= n - 1) {// 如果能够跳到最后一个位置或超过最后一个位置,则返回当前步数+1return step + 1;}if (!visited[nextIndex]) {visited[nextIndex] = true;queue.offer(nextIndex);}}}step++;}return -1; // 如果无法达到最后一个位置,则返回 -1}
}

在这个实现中,我们使用一个队列 queue 来广度优先搜索每个位置能够跳跃到的下一个位置。

  1. 初始时,我们将起始位置加入队列,并将其标记为已访问。
  2. 然后,我们不断从队列中取出当前位置,遍历它能够跳跃的最大长度内的所有位置。如果遍历过程中发现某个位置能够跳到最后一个位置或超过最后一个位置,则返回当前步数+1,表示跳跃结束。
  3. 如果无法达到最后一个位置,则返回 -1。

复杂度分析:

时间复杂度:

  • 遍历数组的过程中,每个位置最多会被访问一次,因此遍历数组的时间复杂度是 O(n)。
  • 在最坏情况下,队列中的元素数量可以达到 n,每个元素都需要进行扩展操作。在每个扩展操作中,需要遍历当前位置能够跳跃的最大长度内的所有位置。由于最大跳跃长度的上限是 n,因此每个位置进行扩展操作的时间复杂度是 O(n)。总的时间复杂度是 O(n^2)。

空间复杂度:

  • 使用一个队列来保存当前位置,队列的最大长度不会超过 n,因此队列的空间复杂度是 O(n)。
  • 使用一个布尔数组 visited 来记录已访问的位置,数组的长度与数组 nums 的长度相同,因此布尔数组的空间复杂度也是 O(n)。
  • 总的空间复杂度是 O(n)。

需要注意的是,由于贪婪算法的效率更高,动态规划和广度优先搜索通常在处理较大输入规模时才会被使用。在小规模问题上,贪婪算法往往是更快的解决方法。

LeetCode运行结果:

方法四:逆向贪婪算法

除了贪婪算法、动态规划和广度优先搜索,还有另外一种常用的解决方法,称为跳跃游戏问题的逆向贪婪算法。

逆向贪婪算法的基本思路是从目标位置开始向起始位置遍历,每次选择能够到达当前位置的最远跳跃位置作为新的目标位置,直到遍历到起始位置为止。这样可以得到从起始位置到目标位置的最小跳跃次数。

class Solution {public int jump(int[] nums) {int position = nums.length - 1;int jumps = 0;while (position > 0) {for (int i = 0; i < position; i++) {if (i + nums[i] >= position) {position = i;jumps++;break;}}}return jumps;}
}

在这个实现中,我们使用变量 position 来表示当前的目标位置,初始化为数组的最后一个位置。变量 jumps 记录跳跃次数,初始化为 0。

通过一个循环,我们从目标位置开始向起始位置遍历。内层循环遍历从当前位置到目标位置之间的所有位置,找到第一个能够跳跃到目标位置的位置,更新 position 和 jumps,然后继续向前遍历。

最终,返回 jumps 作为结果。

复杂度分析:

时间复杂度:

  • 遍历数组进行内层循环时,最多需要执行 n 次,其中 n 是数组 nums 的长度。因此,内层循环的时间复杂度是 O(n)。
  • 外层循环从目标位置开始,通过不断更新目标位置进行遍历,最多执行 n-1 次。因此,外层循环的时间复杂度是 O(n)。 综合起来,逆向贪婪算法的时间复杂度是 O(n)。

空间复杂度:

  • 逆向贪婪算法只使用了常数级别的变量,没有使用额外的空间。因此,空间复杂度是 O(1)。

总结起来,逆向贪婪算法是一种时间复杂度为 O(n),空间复杂度为 O(1) 的解决方法。相比于动态规划和广度优先搜索等其他方法,它具有更低的时间复杂度,但需要注意的是,逆向贪婪算法的前提是能够到达目标位置,否则会陷入无限循环。

LeetCode运行结果:

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

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

相关文章

使用不同尺寸的传感器拍照时,怎么保证拍出同样视场范围的照片?

1、问题背景 使用竞品机做图像效果对比时&#xff0c;我们通常都会要求拍摄的照片要视场范围一致&#xff0c;这样才具有可比性。之前我会考虑用同样焦距、同样分辨率的设备去拍照对比就可以了&#xff0c;觉得相机的视场范围只由镜头焦距来决定。 但如果对于不同尺寸的传感器…

基于视频技术与AI检测算法的体育场馆远程视频智能化监控方案

一、方案背景 近年来&#xff0c;随着居民体育运动意识的增强&#xff0c;体育场馆成为居民体育锻炼的重要场所。但使用场馆内的器材时&#xff0c;可能发生受伤意外&#xff0c;甚至牵扯责任赔偿纠纷问题。同时&#xff0c;物品丢失、人力巡逻成本问题突出&#xff0c;体育场…

likeadmin和fastapi的bug

以下内容写于2023年8月11日 bug 1 请求体 - 多个参数 - FastAPI (tiangolo.com)中“请求体中的单一值”处&#xff0c;选python3.6&#xff0c;接口示例代码是 from typing import Unionfrom fastapi import Body, FastAPI from pydantic import BaseModel from typing_exte…

Kubernetes组件和架构简介

目录 一.概念简介 1.含义&#xff1a; 2.主要功能&#xff1a; 3.相关概念&#xff1a; 二.组件和架构介绍 1.master&#xff1a;集群的控制平面&#xff0c;管理集群 2.node&#xff1a;集群的数据平面&#xff0c;为容器提供工作环境 3.kubernetes简单架构图解 一.概…

无线WIFI工业路由器可用于楼宇自动化

钡铼4G工业路由器支持BACnet MS/TP协议。BACnet MS/TP协议是一种用于工业自动化的开放式通信协议&#xff0c;被广泛应用于楼宇自动化、照明控制、能源管理等领域。通过钡铼4G工业路由器的支持&#xff0c;可以使设备间实现高速、可靠的数据传输&#xff0c;提高自动化水平。 钡…

SpringBoot——常用注解

Spring Web MVC与Spring Bean注解 Controller/RestController Controller是Component注解的一个延伸&#xff0c;Spring 会自动扫描并配置被该注解标注的类。此注解用于标注Spring MVC的控制器。 Controller RequestMapping("/api/v1") public class UserApiContr…

LeetCode 518.零钱兑换II 动态规划 + 完全背包 + 组合数

给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号整数。 示例…

leetCode 62.不同路径 动态规划 + 空间复杂度优化

62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xf…

大数据之Flume

Flume概述 一个高可用&#xff08;稳定&#xff09;&#xff0c;高可靠&#xff08;稳定&#xff09;&#xff0c;分布式的海量日志采集&#xff0c;聚合和传输的系统。Flume基于流式架构&#xff0c;灵活简单。日志文件即txt文件&#xff0c;不能传输音频&#xff0c;视频&am…

194、SpringBoot -- 下载和安装 Erlang 、 RabbitMQ

本节要点&#xff1a; 一些命令&#xff1a; 小黑窗输入&#xff1a; rabbitmq-plugins enable rabbitmq_management 启动控制台插件 rabbitmq-server 启动rabbitMQ服务器 管理员启动小黑窗&#xff1a; rabbitmq-service install 添加rabbitMQ为本地服务 启动浏览器访问 ht…

stl格式-3D三角形

文章目录 什么是stl文件?格式首选stl的语法1.这是一个stl格式的文件:(ASCII码)2.下面先举个例子(难度略微提示)补充:关于\<\<我试了一下:这个法线你随便写好像也没问题\>> 3.来个立方体4.最后再写一个由三个直角形组成的立方体(直棱锥)5.amend 修正(右手定则,法线…

如何定时备份使用Docker构建的MySQL容器中的数据库

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

单目标应用:基于螳螂搜索算法(Mantis Search Algorithm,MSA)的微电网优化调度MATLAB

一、螳螂搜索算法 螳螂搜索算法&#xff08;Mantis Search Algorithm&#xff0c;MSA&#xff09;由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模拟螳螂独特的狩猎和性同类相食行为。MSA由三个优化阶段组成&#xff0c;包括寻找猎物&#xff08;探索&#xff09…

OpenHarmony自定义组件介绍

一、创建自定义组件 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为系统组件&#xff0c;由开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合使用&#xff0c;而是需要考虑代码可复用性、业务逻辑…

Windows 下安装和配置 Redis (详细图文)

目录 下载 Redis安装 Redis配置 Redis修改密码(可选)配置环境变量注册系统服务 Redis 桌面管理工具附&#xff1a;开源项目微服务商城项目前后端分离项目 下载 Redis 访问 Redis 下载地址&#xff1a;https://github.com/tporadowski/redis/releases 下载 Redis 时&#xff0c…

Golang的测试、基准测试和持续集成

在Golang中&#xff0c;内置的垃圾回收器处理内存管理&#xff0c;自动执行内存分配和释放。 单元测试是软件开发中至关重要的一个方面&#xff0c;它确保了代码的正确性并在开发过程中尽早发现错误。在Go中&#xff0c;编写有效的单元测试非常简单&#xff0c;并为开发人员提…

Bee2.1.8支持Spring Boot 3.0.11,active命令行选择多环境,多表查改增删(bee-spring-boot发布,更新maven)

天下大势&#xff0c;分久必合&#xff01; Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鸿蒙) Bee Spring Cloud 微服务使用数据库更方便&#xff1a;Bee Spring Boot; 轻松支持多数据源&#xff0c;Sharding, Mongodb. 要整合一堆的…

【Java 进阶篇】深入理解 SQL 聚合函数

在 SQL 数据库中&#xff0c;聚合函数是一组强大的工具&#xff0c;用于处理和分析数据。它们可以帮助您对数据进行统计、计算总和、平均值、最大值、最小值等操作。无论您是数据库开发者、数据分析师还是希望更好地了解 SQL 数据库的用户&#xff0c;了解聚合函数都是非常重要…

【算法练习Day8】 kmp算法找出字符串中第一个匹配项的下标反转字符串中的单词重复的子字符串

、​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 kmp算法找出字符串中第…

ubuntu18.04 OpenGL开发(显示YUV)

源码参考&#xff1a;https://download.csdn.net/download/weixin_55163060/88382816 安装opengl库 sudo apt install libglu1-mesa-dev freeglut3-dev mesa-common-dev 安装opengl工具包 sudo apt install mesa-utils 检查opengl版本信息&#xff08;桌面终端执行&#xff09…