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

怒刷LeetCode的第14天(Java版)

目录

第一题

题目来源

题目内容

解决方法

方法一:动态规划

方法二:栈

方法三:双指针

第二题

题目来源

题目内容

解决方法

方法一:二分查找

方法二:线性扫描

方法三:递归

第三题

题目来源

题目内容

解决方法

方法一:二分查找

方法二:线性扫描

方法三:双指针


第一题

题目来源

32. 最长有效括号 - 力扣(LeetCode)

题目内容

解决方法

方法一:动态规划

  1. 创建一个长度为 n 的数组 dp,用于保存以当前字符结尾的最长有效括号子串的长度。
  2. 初始化 dp 数组的所有元素为 0。
  3. 遍历字符串 s 的每个字符:
    • 如果当前字符是 (,则直接跳过。
    • 如果当前字符是 ),则判断前一个字符是否是 (
      • 如果前一个字符是 (,则更新 dp[i] = dp[i-2] + 2,表示以当前字符结尾的最长有效括号子串长度为前一个字符结尾的最长有效括号子串长度加上当前的两个括号。
      • 如果前一个字符是 ),则判断前一个字符结尾的最长有效括号子串之前的字符是否是 (,即判断 i-dp[i-1]-1 位置的字符是否是 (
        • 如果是 (,则更新 dp[i] = dp[i-1] + dp[i-dp[i-1]-2] + 2,表示以当前字符结尾的最长有效括号子串长度为前一个字符结尾的最长有效括号子串长度加上前一个字符结尾的最长有效括号子串之前的最长有效括号子串长度加上当前的两个括号。
  4. 遍历完整个字符串后,找出 dp 数组中的最大值,即为最长有效括号子串的长度。
public class Solution {public int longestValidParentheses(String s) {if (s == null || s.length() == 0) {return 0;}int n = s.length();int[] dp = new int[n];int maxLen = 0;for (int i = 1; i < n; i++) {if (s.charAt(i) == ')') {if (s.charAt(i - 1) == '(') {dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;} else if (i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(') {dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;}maxLen = Math.max(maxLen, dp[i]);}}return maxLen;}
}

复杂度分析:

时间复杂度:

  • 遍历字符串 s 的每个字符需要 O(n) 的时间。
  • 在每个字符上,我们都进行了常数次的比较和更新操作。
  • 因此,总体上,时间复杂度为 O(n)。

空间复杂度:

  • 我们使用了一个长度为 n 的数组 dp 来保存以当前字符结尾的最长有效括号子串的长度。
  • 因此,空间复杂度为 O(n)。

综合起来,该解法的时间复杂度为 O(n),空间复杂度为 O(n)。

注意:对于这个特定的问题,在给定的限制条件下(0 <= s.length <= 3 * 10^4),这个解法是高效且可行的。

LeetCode运行结果:

方法二:栈

该方法的思路如下:

  • 首先,我们使用一个栈来保存括号的索引位置。
  • 初始化栈,将一个特殊的值 -1 放入栈中。
  • 遍历字符串 s 的每个字符:
    • 如果遇到左括号 (,将其索引位置压入栈中。
    • 如果遇到右括号 ),弹出栈顶元素,表示当前右括号匹配了一个左括号。
      • 如果栈为空,将当前右括号的索引位置压入栈中,作为一个新的起点。
      • 如果栈不为空,计算当前有效括号子串的长度,更新最大长度。
  • 最后,返回最大长度即可。
import java.util.Stack;public class Solution {public int longestValidParentheses(String s) {if (s == null || s.length() == 0) {return 0;}int maxLen = 0;Stack<Integer> stack = new Stack<>();stack.push(-1);for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if (c == '(') {stack.push(i);} else {stack.pop();if (stack.isEmpty()) {stack.push(i);} else {maxLen = Math.max(maxLen, i - stack.peek());}}}return maxLen;}
}

复杂度分析:

时间复杂度:

  • 遍历字符串 s 的每个字符需要 O(n) 的时间。
  • 在每个字符上,我们进行了常数次的栈操作(压栈和弹栈)。
  • 因此,总体上,时间复杂度为 O(n)。

空间复杂度:

  • 我们使用了一个栈来保存括号的索引位置。
  • 在最坏情况下,当所有字符都是左括号时,栈的大小为 n。
  • 因此,空间复杂度为 O(n)。

综合起来,该方法的时间复杂度为 O(n),空间复杂度为 O(n)。

LeetCode运行结果:

方法三:双指针

除了动态规划和栈,还有一种双指针的方法来解决最长有效括号问题。

这种方法的思路如下:

  • 从左到右遍历字符串,统计左右括号的数量。
  • 如果左右括号数量相等,则更新最大长度。
  • 如果右括号数量大于左括号数量,则重置左右括号数量为0。
  • 然后从右到左再进行一次相同的操作。
public class Solution {public int longestValidParentheses(String s) {if (s == null || s.length() == 0) {return 0;}int left = 0; // 左括号数量int right = 0; // 右括号数量int maxLen = 0; // 最大长度// 从左到右遍历for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if (c == '(') {left++;} else {right++;}// 如果左括号数量等于右括号数量,则计算当前有效括号子串的长度if (left == right) {maxLen = Math.max(maxLen, right * 2);} else if (right > left) { // 右括号数量大于左括号数量,重置左右括号数量为0left = 0;right = 0;}}left = 0;right = 0;// 从右到左遍历for (int i = s.length() - 1; i >= 0; i--) {char c = s.charAt(i);if (c == ')') {right++;} else {left++;}// 如果左括号数量等于右括号数量,则计算当前有效括号子串的长度if (left == right) {maxLen = Math.max(maxLen, left * 2);} else if (left > right) { // 左括号数量大于右括号数量,重置左右括号数量为0left = 0;right = 0;}}return maxLen;}
}

复杂度分析:

时间复杂度:

  • 遍历字符串 s 的每个字符需要 O(n) 的时间。
  • 在第一次从左到右遍历中,我们进行了常数次的操作,不会产生额外的时间复杂度。
  • 在第二次从右到左遍历中,同样也进行了常数次的操作。
  • 因此,总体上,时间复杂度为 O(n)。

空间复杂度:

  • 我们只使用了常数个变量来保存左右括号的数量和最大长度,没有使用额外的数据结构。
  • 因此,空间复杂度为 O(1)。

综合起来,该方法的时间复杂度为 O(n),空间复杂度为 O(1)。

LeetCode运行结果:

第二题

题目来源

33. 搜索旋转排序数组 - 力扣(LeetCode)

题目内容

解决方法

方法一:二分查找

使用二分查找的思想,通过判断左右半边哪一边是有序的来决定向哪边继续查找。具体步骤如下:

  1. 初始化左指针 left 为数组的第一个元素的索引,右指针 right 为数组最后一个元素的索引。
  2. 在每次循环中,计算中间元素的索引 mid
  3. 如果中间元素等于目标值,则返回 mid
  4. 判断左半边是否有序(即 nums[left] <= nums[mid]):
    • 如果目标值在左半边的有序范围内,则将右指针 right 移动到 mid - 1,继续在左半边查找。
    • 否则,将左指针 left 移动到 mid + 1,继续在右半边查找。
  5. 如果左半边不是有序的,则右半边一定是有序的。判断目标值是否在右半边的有序范围内:
    • 如果是,则将左指针 left 移动到 mid + 1,继续在右半边查找。
    • 否则,将右指针 right 移动到 mid - 1,继续在左半边查找。
  6. 如果循环结束仍未找到目标值,则返回 -1。
public class Solution {public int search(int[] nums, int target) {if (nums == null || nums.length == 0) {return -1;}int left = 0;int right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;}if (nums[left] <= nums[mid]) { // 左半边有序if (target >= nums[left] && target < nums[mid]) {right = mid - 1;} else {left = mid + 1;}} else { // 右半边有序if (target > nums[mid] && target <= nums[right]) {left = mid + 1;} else {right = mid - 1;}}}return -1;}
}

复杂度分析:

  • 该算法的时间复杂度为O(log n),其中n是数组的长度。在每次循环中,都将搜索范围缩小一半,所以总共最多需要进行log n次循环。因此,算法的时间复杂度为O(log n)。
  • 空间复杂度为O(1),因为算法只使用了有限的额外空间来存储指针和常量。

总结起来,该算法具有较低的时间复杂度和空间复杂度,能够高效地解决搜索旋转排序数组的问题。

LeetCode运行结果:

方法二:线性扫描

除了二分查找的方法,还可以使用线性扫描的方法来搜索旋转排序数组。

该算法从数组的第一个元素开始,依次遍历数组中的每个元素,如果找到目标值,则返回其索引;如果遍历结束仍未找到目标值,则返回-1。

public class Solution {public int search(int[] nums, int target) {if (nums == null || nums.length == 0) {return -1;}for (int i = 0; i < nums.length; i++) {if (nums[i] == target) {return i;}}return -1;}
}

复杂度分析:

  • 线性扫描算法的时间复杂度为O(n),其中n是数组的长度。算法需要遍历整个数组来查找目标值,因此最坏情况下需要执行n次比较操作。
  • 空间复杂度为O(1),因为算法没有使用额外的空间,只需常数级别的额外空间。

相对于二分查找算法的O(log n)时间复杂度,线性扫描算法的时间复杂度较高。但在某些特定场景或者输入规模较小的情况下,线性扫描算法也可以快速解决问题。

综上所述,线性扫描算法适用于简单的问题或者规模较小的数据集,但在更大规模的数据集上,二分查找算法通常更具优势。

LeetCode运行结果:

方法三:递归

除了二分查找和线性扫描的方法,还可以使用递归的方法来搜索旋转排序数组。

该算法与二分查找算法类似,也是通过判断左右半边哪一边是有序的来决定向哪边继续查找。不同之处在于,该算法使用递归的方式实现,将数组的搜索范围不断缩小。

  1. 算法首先检查数组是否为空或者长度为0,如果是,则返回-1。然后调用递归函数 search 进行搜索,传入参数 nums 数组、目标值 target、搜索范围的左右端点索引 left 和 right。
  2. 在递归函数中,首先判断搜索范围是否合法,如果不合法,则返回-1。然后计算中间元素索引 mid。如果中间元素等于目标值,则返回 mid。
  3. 接着判断左半边是否有序(即 nums[left] <= nums[mid])。如果是,则判断目标值是否在左半边的有序范围内。如果是,则继续在左半边递归查找;否则,在右半边递归查找。
  4. 如果左半边不是有序的,则右半边一定是有序的。判断目标值是否在右半边的有序范围内。如果是,则在右半边递归查找;否则,在左半边递归查找。
  5. 最后,如果循环结束仍未找到目标值,则返回-1。
public class Solution {public int search(int[] nums, int target) {if (nums == null || nums.length == 0) {return -1;}return search(nums, target, 0, nums.length - 1);}private int search(int[] nums, int target, int left, int right) {if (left > right) {return -1;}int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;}if (nums[left] <= nums[mid]) { // 左半边有序if (target >= nums[left] && target < nums[mid]) {return search(nums, target, left, mid - 1);} else {return search(nums, target, mid + 1, right);}} else { // 右半边有序if (target > nums[mid] && target <= nums[right]) {return search(nums, target, mid + 1, right);} else {return search(nums, target, left, mid - 1);}}}
}

复杂度分析:

时间复杂度:

  • 最好情况下,数组是完全有序的,每次都能通过比较找到目标值,时间复杂度为 O(log n)。
  • 最坏情况下,每次都只能排除一个元素,需要遍历整个数组,时间复杂度为 O(n)。
  • 平均情况下,假设数组中大致一半是有序的,一半是无序的,时间复杂度介于 O(log n) 和 O(n) 之间。

空间复杂度:

  • 每次递归调用会在栈上保存一些临时变量和返回地址,最大递归深度为 log n,因此空间复杂度为 O(log n)。

综合考虑,递归搜索旋转排序数组的算法在最坏情况下的时间复杂度为 O(n),空间复杂度为 O(log n)。但如果数组是近似有序的或者目标值位于有序部分内,时间复杂度可以接近 O(log n),效率较高。

需要注意的是,递归算法和二分查找算法类似,但由于需要额外的栈空间,因此可能会更慢。在处理超大规模数据时,可能会导致栈溢出问题。

LeetCode运行结果:

第三题

题目来源

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

题目内容

解决方法

方法一:二分查找

  1. 首先,我们定义一个长度为2的整数数组 result,并初始化为 {-1, -1}。这个数组表示目标值的开始位置和结束位置。
  2. 然后,我们使用两个辅助函数 findLeft 和 findRight 来分别查找目标值的开始位置和结束位置。
  3. 在 findLeft 函数中,我们使用二分查找来搜索目标值的开始位置。初始时,左边界 left 指向数组的第一个元素,右边界 right 指向数组的最后一个元素。在每次循环中,计算中间元素索引 mid,并将它与目标值进行比较。如果中间元素大于或等于目标值,则将右边界 right 缩小为 mid;否则,将左边界 left 扩大为 mid + 1。最后,返回 left 的值作为目标值的开始位置。如果目标值不存在,则返回 -1。
  4. 在 findRight 函数中,我们同样使用二分查找来搜索目标值的结束位置。不过这次的二分查找稍有不同。初始时,左边界 left 指向数组的第一个元素,右边界 right 指向数组的最后一个元素。在每次循环中,计算中间元素索引 mid,并将它与目标值进行比较。如果中间元素小于或等于目标值,则将左边界 left 扩大为 mid;否则,将右边界 right 缩小为 mid - 1。最后,返回 left 的值作为目标值的结束位置。如果目标值不存在,则返回 -1。
  5. 最后,在主函数 searchRange 中,我们首先判断特殊情况,即数组为空或长度为0的情况,直接返回初始化好的 result 数组。
  6. 然后,我们通过调用辅助函数 findLeft 和 findRight 分别得到目标值的开始位置和结束位置,并将它们存储在 result 数组中。
  7. 最后,返回 result 数组作为结果。
class Solution {public int[] searchRange(int[] nums, int target) {int[] result = {-1, -1};if (nums == null || nums.length == 0) {return result;}int leftIndex = findLeft(nums, target);int rightIndex = findRight(nums, target);if (leftIndex <= rightIndex) {result[0] = leftIndex;result[1] = rightIndex;}return result;}private int findLeft(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] >= target) {right = mid;} else {left = mid + 1;}}return nums[left] == target ? left : -1;}private int findRight(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left < right) {int mid = left + (right - left) / 2 + 1;if (nums[mid] <= target) {left = mid;} else {right = mid - 1;}}return nums[left] == target ? left : -1;}
}

复杂度分析:

  • 时间复杂度:O(log n)。每次迭代都将搜索空间减半,因此时间复杂度为对数级别。
  • 空间复杂度:O(1)。仅使用了有限的额外空间来存储几个变量。

LeetCode运行结果:

方法二:线性扫描

除了二分查找,还可以使用线性扫描的方法来搜索排序数组中目标值的开始位置和结束位置。

  1. 我们首先遍历整个数组来查找目标值的开始位置。如果找到目标值,我们将其索引存储在 result[0] 中并立即退出循环。如果没有找到目标值,则 result[0] 保持为初始值 -1。
  2. 接着,我们再从数组的末尾开始向前遍历,查找目标值的结束位置。如果找到目标值,我们将其索引存储在 result[1] 中并立即退出循环。如果没有找到目标值,则 result[1] 保持为初始值 -1。
  3. 最后,我们返回存储了目标值开始位置和结束位置的 result 数组。
class Solution {public int[] searchRange(int[] nums, int target) {int[] result = {-1, -1};if (nums == null || nums.length == 0) {return result;}for (int i = 0; i < nums.length; i++) {if (nums[i] == target) {result[0] = i;break;}}if (result[0] != -1) {for (int j = nums.length - 1; j >= 0; j--) {if (nums[j] == target) {result[1] = j;break;}}}return result;}
}

复杂度分析:

  • 时间复杂度:O(n)。需要遍历整个数组,其中 n 是数组的长度。
  • 空间复杂度:O(1)。仅使用了有限的额外空间来存储几个变量。

因为二分查找的时间复杂度为 log n,而线性扫描的时间复杂度为 n,所以在数组较大且已排序的情况下,二分查找的性能更好。它减少了搜索空间的大小,使得平均查找次数更低。然而,在数组较小或未排序的情况下,线性扫描是一种简单有效的方法。

LeetCode运行结果:

方法三:双指针

除了二分查找和线性扫描,还有一种常用的方法是双指针法。这种方法适用于有序数组或部分有序数组,并且可以在 O(n) 的时间复杂度内找到目标值的开始位置和结束位置。

class Solution {public int[] searchRange(int[] nums, int target) {int[] result = {-1, -1};if (nums == null || nums.length == 0) {return result;}int left = 0;int right = nums.length - 1;// 查找目标值的开始位置while (left <= right) {if (nums[left] == target && nums[right] == target) {result[0] = left;result[1] = right;break;}if (nums[left] < target) {left++;}if (nums[right] > target) {right--;}}return result;}
}

在上述代码中,我们使用两个指针 left 和 right 来标记搜索区间。通过不断更新指针的位置,我们可以确定目标值的开始位置和结束位置。

具体步骤如下:

  1. 初始化指针 left 和 right 分别指向数组的首尾元素。
  2. 当 left 指向的元素小于目标值时,将 left 向右移动一位。
  3. 当 right 指向的元素大于目标值时,将 right 向左移动一位。
  4. 如果 left 和 right 指向的元素都等于目标值,则找到了目标值的开始位置和结束位置。将结果存储在 result 数组中,并退出循环。
  5. 如果找不到目标值,则返回初始值为 -1 的 result 数组。

复杂度分析:

  • 使用双指针法的时间复杂度是 O(n),其中 n 是数组的长度。在最坏的情况下,即目标值不在数组中或者目标值在数组中出现了 n 次,我们需要将指针 left 和 right 分别移动到数组的两端。因此,最多需要遍历整个数组一次,时间复杂度为 O(n)。
  • 空间复杂度是 O(1),因为我们只需要使用有限的额外变量来记录指针的位置和存储结果数组。

需要注意的是,双指针法适用于有序数组或部分有序数组,如果数组无序,则双指针法无法正确找到目标值的开始位置和结束位置。

LeetCode运行结果:

相关文章:

怒刷LeetCode的第14天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;动态规划 方法二&#xff1a;栈 方法三&#xff1a;双指针 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;二分查找 方法二&#xff1a;线性扫描 方法三&#xff1a;递归 第三题 题目来源 …...

c语言 static

1、静态局部变量在程序加载时初始化&#xff0c;静态局部变量的初始值写入到了data段&#xff1a; 如下代码test_symbol.c int f() {static int x 0;return x; }int g() {static int x 9;return x; }使用命令gcc -c test_symbol.c -o test_symbol 编译 使用命令 readelf -a …...

java基础3

输入一个班学生的成绩&#xff0c;先显示所有及格的成绩&#xff0c;再显示所有不及格的成绩&#xff0c;最后显示及格人数和不及格人数 import java.util.Scanner; public class Hello{public static void main(String [] args) {int SIZE5;double grade[] new double[SIZE]…...

LeetCode 1194.锦标赛优胜者

数据准备 Create table If Not Exists Players (player_id int, group_id int); Create table If Not Exists Matches (match_id int, first_player int, second_player int, first_score int, second_score int); Truncate table Players; insert into Players (player_id, g…...

多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

如何用ArkUI实现一个加入购物车效果?

关键词&#xff1a;ArkUI的动效能力&#xff0c;动效开发&#xff0c;ArkUI动画 我们在购买商品时&#xff0c;往往习惯将商品先加入购物车&#xff0c;然后在购物车里确认后再下订单&#xff0c;这是一个典型的访问者模式。对于这个高频场景&#xff0c;增添一些动效可以增加a…...

ChatGLM GPT原理介绍

图解GPT 除了BERT以外,另一个预训练模型GPT也给NLP领域带来了不少轰动,本节也对GPT做一个详细的讲解。 OpenAI提出的GPT-2模型(https://openai.com/blog/better-language-models/) 能够写出连贯并且高质量的文章,比之前语言模型效果好很多。GPT-2是基于Transformer搭建的,相…...

2015年蓝桥杯省赛C/C++ A组 灾后重建题解(100分)

10. 灾后重建 Pear市一共有N&#xff08;<50000&#xff09;个居民点&#xff0c;居民点之间有M&#xff08;<200000&#xff09;条双向道路相连。这些居民点两两之间都可以通过双向道路到达。这种情况一直持续到最近&#xff0c;一次严重的地震毁坏了全部M条道路。 震后…...

Elasticsearch(四)深分页Scroll

一、前言 1.1、scroll与fromsize区别 ES对于fromsize的个数是有限制的&#xff0c;二者之和不能超过1w。当所请求的数据总量大于1w时&#xff0c;可用scroll来代替fromsize。 fromsize在ES查询数据的方式步骤如下&#xff1a; 1、先将用户指定的关键字进行分词&#xff1b;…...

JavaWeb后端开发 JWT令牌解析 登录校验 通用模板/SpringBoot整合

目录 实现思路 会话跟踪的三个方案--引出Jwt令牌技术 1.访问cookie的值,在同一会话的不同请求之间共享数据 2.session 3.现代普遍采用的令牌技术--JWT令牌 JWT令牌技术 ​第一步--生成令牌 1.引入依赖 2.生成令牌 第二步--校验令牌 第三步--登录下发令牌 需要解决的…...

Sparta工具用法描述之信息收集(漏洞分析)

声明:本文仅做学习与交流,任何用于非法用途、行为等造成他人损失的,责任自负。本文不承担任何法律责任。 Sparta是python GUI应用程序,它通过在扫描和枚举阶段协助渗透测试仪来简化网络基础结构渗透测试。 通过点击并单击工具箱并以方便的方式显示所有工具输出,它可以使测…...

Vue复选框批量删除示例

Vue复选框批量删除 通过使用v-model指令绑定单个复选框 例如<input type"checkbox" id"checkbox" v-model"checked"> 而本次我们要做的示例大致是这样的&#xff0c;首先可以增加内容&#xff0c;然后通过勾选来进行单独或者批量删除&…...

Docker自定义镜像

一、镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 镜像是分层结构&#xff0c;每一层称为一个Layer BaseImage层&#xff1a;包含基本的系统函数库、环境变量、文件系统其它&#xff1a;在BaseImage基础上添加依赖、安装程序、完成整个应用的…...

ardupilot的编译过程

环境 树莓派4b ubuntu20.04 git 2.25.1 python3.8.10 pixhawk2.4.8 下载源码 &#xff08;已经配置好git环境和ssh&#xff09; git clone --recurse-submodules gitgithub.com:ArduPilot/ardupilot.gitcd ardupilotgit status使用git status检查是否下载完整 如果不完整&a…...

Unity中Shader实现模板测试Stencil

文章目录 前言一、UI中的遮罩1、Mask ——> 模板测试2、RectMask2D ——> UNITY_UI_CLIP_RECT 二、模板缓冲区Stencil一般是和Pass平行的部分&#xff0c;Pass部分写的是颜色缓冲区Stencil:Comp&#xff08;比较操作&#xff09;Pass(模版缓冲区的更新) 三、实际使用1、在…...

多线程与并发

多线程与高并发 线程的创建方式1.继承Thread类 重写run方法2.实现Runnable接口 重写run方法3. 实现Callable 重写call方法&#xff0c;配合FutureTask 线程的使用1.线程的状态1.1. 传统操作系统层面5种状态1.2.Java中给线程准备的6种状态 2.线程的常用方法2.1 获取当前线程2.2 …...

手写call方法

Function.prototype.myCallfunction (context,args) {console.log(arguments)//context 表示call里面的第一个参数也就是需要改变this指向的那个对象。//this表示这个方法//把这个方法挂到需要改变指向的对象身上调用&#xff0c;相当于把this指向了这个对象身上&#xff0c;从…...

基于FPGA的图像直方图统计实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、图像数据传输 4.2、直方图统计算法 4.3、时序控制和电路设计 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescal…...

数据库:Hive转Presto(一)

本人因为工作原因&#xff0c;经常使用hive以及presto&#xff0c;一般是编写hive完成工作&#xff0c;服务器原因&#xff0c;presto会跑的更快一些&#xff0c;所以工作的时候会使用presto验证结果&#xff0c;所以就要频繁hive转presto&#xff0c;为了方便&#xff0c;我用…...

Responder

环境准备 操作系统:Kali Linux工具:responder,john,evil-winrm PS:输入以下命令解决靶场环境无法打开问题 #echo "<靶机IP> unika.htb">>/etc/hostsresponder工具 [Kali 官网] 手册地址:https://www.kali.org/tools/responder/ 摘要: This package c…...

基于下垂控制的并网逆变器控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 主要模块&#xff1a; 建议使用MATLAB2021b及以上版本打开&#xff01; 功率计算模块、下垂控制模块、电压电流双环控制模块、虚拟阻抗压降模块 扰动设置&#xff1a; 在0.5秒到2秒始端设置0.25Hz的电网频…...

android获取RAM、CPU频率、系统版本、CPU核数

参考链接&#xff1a; https://www.jianshu.com/p/76d68d13c475 https://github.com/matthewYang92/Themis 获取CPU频率、核数的逻辑&#xff0c;是通过文件操作实现的&#xff0c;Android是基于Linux系统的&#xff0c;所以该方式针对不同的手机都是可靠的操作方式。 RAM&am…...

微信小程序python+nodejs+php+springboot+vue 讲座预约系统

讲座预约管理系统的用户是系统最根本使用者&#xff0c;按需要分析系统包括用户&#xff1a;学生、管理员。 管理员通过后台的登录页面&#xff0c;选择管理员权限后进行登录&#xff0c;管理员的权限包括学生信息管理和文章公告管理。讲座公告管理&#xff0c;添加讲座公告信息…...

嵌入式开发笔记:STM32的外设GPIO知识学习

GPIO简介&#xff1a; • GPIO &#xff08; General Purpose Input Output &#xff09;通用输入输出口 • 可配置为 8 种输入输出模式 • 引脚电平&#xff1a; 0V~3.3V &#xff0c;部分引脚可容忍 5V &#xff08;如舵机和驱动直流电机&#xff09; • 输出模式下可控制端口…...

单片机论文参考:2、基于单片机的病床呼叫系统设计

任务要求 设计病床呼叫系统&#xff0c;使用3X8矩阵开关分别模拟医院病房与病床位数&#xff0c;当某开关按下时&#xff0c;系统显示呼叫的病房与病床、呼叫的时间。处理完毕可清除该呼叫显示记录。同时有数个病床呼叫时&#xff0c;可以循环呼叫记录显示。 摘要 病房呼叫系统…...

【C语言】结构体实现位段!位段有何作用?

本篇文章目录 1. 声明位段2. 位段的内存分配3. 位段的跨平台问题4.位段的应用5. 如何解决位段的跨平台问题&#xff1f; 1. 声明位段 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 位段的成员必须是 int、unsigned int 或 char。位段的成员名后边有一个冒号和…...

msvcp140为什么会丢失?msvcp140.dll丢失的解决方法

msvcp140.dll 是一个动态链接库文件&#xff0c;它包含了 C 运行时库的一些函数和类&#xff0c;例如全局对象、异常处理、内存管理、文件操作等。它是 Visual Studio 2015 及以上版本中的一部分&#xff0c;用于支持 C 应用程序的运行。如果 msvcp140.dll 丢失或损坏&#xff…...

Ingress Controller

什么是 Ingress Controller &#xff1f; 在云原生生态中&#xff0c;通常来讲&#xff0c;入口控制器( Ingress Controller )是 Kubernetes 中的一个关键组件&#xff0c;用于管理入口资源对象。 Ingress 资源对象用于定义来自外网的 HTTP 和 HTTPS 规则&#xff0c;以控制进…...

离线安装 K3S

一、前言 简要记录一下离线环境下 K3S 的搭建&#xff0c;版本为 v1.23.17k3s1&#xff0c;使用外部数据库 MySQL 作元数据存储&#xff0c;禁用默认组件&#xff08;coredns、servicelb、traefik、local-storage、metrics-server&#xff09;并使用 Helm 单独安装&#xff08…...

Error系列-常见异常问题解决方案以及系统指令总结

前情提要 作为一名开发&#xff0c;日常工作中会遇到很多报错的情况&#xff0c;希望我的总结可以帮助到小伙伴们~日常工作中也会遇到需要部署项目或者登陆linux系统操作的情况&#xff0c;很多时候需要查找一些命令&#xff0c;于是我决定&#xff0c;要把我日常经常用到的一…...