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

LeetCode 每周算法 6(图论、回溯)

LeetCode 每周算法 6(图论、回溯)

图论算法:

在这里插入图片描述

class Solution:  def dfs(self, grid: List[List[str]], r: int, c: int) -> None:  """  深度优先搜索函数,用于遍历并标记与当前位置(r, c)相连的所有陆地(即值为"1"的格子)为已访问(即标记为0)。  :param grid: 二维网格,其中的每个元素都是'0'或'1'。  :param r: 当前遍历到的行索引。  :param c: 当前遍历到的列索引。  """  grid[r][c] = '0'  # 将当前位置标记为已访问(即陆地变为水)  nr, nc = len(grid), len(grid[0])  # 获取网格的行数和列数  # 遍历当前位置的上下左右四个相邻位置  for x, y in [(r - 1, c), (r + 1, c), (r, c - 1), (r, c + 1)]:  # 检查相邻位置是否在网格范围内且为陆地(即值为'1')  if 0 <= x < nr and 0 <= y < nc and grid[x][y] == "1":  self.dfs(grid, x, y)  # 递归地遍历相邻的陆地  def numIslands(self, grid: List[List[str]]) -> int:  """  计算给定网格中的岛屿数量。  :param grid: 二维网格,其中的每个元素都是'0'或'1'。  :return: 网格中的岛屿数量。  """  nr = len(grid)  if nr == 0:  # 如果网格为空,则岛屿数量为0  return 0  nc = len(grid[0])  # 获取网格的列数  num_islands = 0  # 初始化岛屿数量为0  for r in range(nr):  # 遍历网格的每一行  for c in range(nc):  # 遍历网格的每一列  if grid[r][c] == "1":  # 如果当前位置是陆地  num_islands += 1  # 岛屿数量加1  self.dfs(grid, r, c)  # 调用dfs函数遍历并标记与当前陆地相连的所有陆地  return num_islands  # 返回岛屿数量

在这里插入图片描述

class Solution:  def orangesRotting(self, grid: List[List[int]]) -> int:  R, C = len(grid), len(grid[0])  # 获取网格的行数和列数  # 初始化一个队列,用于存放腐烂橙子(值为2)的位置及其腐烂时间(初始为0)  queue = deque()  for r, row in enumerate(grid):  for c, val in enumerate(row):  if val == 2:  queue.append((r, c, 0))  # 定义一个辅助函数,用于生成当前橙子位置(r, c)的上下左右四个相邻位置  def neighbors(r, c):  for nr, nc in ((r - 1, c), (r, c - 1), (r + 1, c), (r, c + 1)):  if 0 <= nr < R and 0 <= nc < C:  # 确保相邻位置在网格范围内  yield nr, nc  d = 0  # 初始化腐烂时间计数器  while queue:  # 当队列不为空时,继续执行  r, c, d = queue.popleft()  # 从队列中取出腐烂橙子的位置及其腐烂时间  for nr, nc in neighbors(r, c):  # 遍历当前腐烂橙子的四个相邻位置  if grid[nr][nc] == 1:  # 如果相邻位置是新鲜的橙子  grid[nr][nc] = 2  # 将其标记为腐烂的橙子  queue.append((nr, nc, d + 1))  # 将其加入队列,并更新腐烂时间为当前时间+1  # 检查网格中是否还有新鲜的橙子(值为1)  if any(1 in row for row in grid):  return -1  # 如果有,说明无法让所有橙子都腐烂,返回-1  return d  # 否则,返回最后的腐烂时间

在这里插入图片描述

class Solution:  def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:  # 创建一个defaultdict来存储课程的邻接表,即每个课程的后继课程列表  edges = collections.defaultdict(list)  # 创建一个列表来存储每个课程的入度(即有多少课程是该课程的前置课程)  indeg = [0] * numCourses  # 遍历先决条件列表,构建邻接表和入度列表  for info in prerequisites:  # info[1] 是当前课程,info[0] 是其前置课程  # 将当前课程(info[1])的后继课程(info[0])添加到邻接表中  edges[info[1]].append(info[0])  # 将前置课程(info[0])的入度加1  indeg[info[0]] += 1  # 创建一个双端队列,用于存储入度为0的课程(即没有前置课程的课程)  q = collections.deque([u for u in range(numCourses) if indeg[u] == 0])  # 初始化已访问(或已完成)的课程数  visited = 0  # 使用广度优先搜索(BFS)遍历课程  while q:  # 每从队列中取出一个课程,表示该课程可以完成  visited += 1  u = q.popleft()  # 遍历当前课程的所有后继课程  for v in edges[u]:  # 将后继课程的入度减1,表示完成了一个前置课程  indeg[v] -= 1  # 如果后继课程的入度变为0,说明其所有前置课程都已完成,可以加入队列继续搜索  if indeg[v] == 0:  q.append(v)  # 如果已访问的课程数等于总课程数,说明所有课程都可以完成  # 否则,存在环,无法完成所有课程  return visited == numCourses

在这里插入图片描述

class Trie:  def __init__(self):  # 初始化Trie节点,children是一个长度为26的列表,# 用于存储指向子节点的引用(假设只处理小写字母a-z)  # 每个位置对应一个字母(例如,0对应'a',1对应'b',...,25对应'z')  # isEnd用于标记该节点是否是某个单词的结尾  self.children = [None] * 26  self.isEnd = False  def searchPrefix(self, prefix: str) -> "Trie":  # 搜索并返回给定前缀对应的最后一个Trie节点  # 如果前缀不存在于Trie中,则返回None  node = self  # 从根节点开始搜索  for ch in prefix:  # 将字符转换为对应的索引('a'->0, 'b'->1, ..., 'z'->25)  ch = ord(ch) - ord("a")  # 如果当前节点的children中对应字符的节点不存在,说明前缀不存在,返回None  if not node.children[ch]:  return None  # 否则,移动到子节点继续搜索  node = node.children[ch]  # 如果所有字符都成功匹配,返回最后一个节点  return node  def insert(self, word: str) -> None:  # 将一个单词插入到Trie中  node = self  # 从根节点开始插入  for ch in word:  # 将字符转换为对应的索引  ch = ord(ch) - ord("a")  # 如果当前节点的children中对应字符的节点不存在,则创建一个新的Trie节点  if not node.children[ch]:  node.children[ch] = Trie()  # 移动到子节点继续插入  node = node.children[ch]  # 标记最后一个节点为单词的结尾  node.isEnd = True  def search(self, word: str) -> bool:  # 搜索Trie中是否存在一个完整的单词  # 使用searchPrefix找到最后一个节点,然后检查该节点是否是某个单词的结尾  node = self.searchPrefix(word)  return node is not None and node.isEnd  def startsWith(self, prefix: str) -> bool:  # 检查Trie中是否存在以给定前缀开头的单词  # 使用searchPrefix找到最后一个节点,如果找到,则说明存在以该前缀开头的单词  return self.searchPrefix(prefix) is not None# Your Trie object will be instantiated and called as such:
# obj = Trie()
# obj.insert(word)
# param_2 = obj.search(word)
# param_3 = obj.startsWith(prefix)

图论算法:

在这里插入图片描述

class Solution {  
public:  // 回溯函数,用于生成所有排列  // res: 存储所有排列的二维向量  // output: 当前排列的向量,通过修改它来生成新的排列  // first: 当前需要确定位置的索引(从0开始)  // len: 输入数组nums的长度,即需要排列的元素总数  void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len) {  // 如果已经处理完所有元素(即已经填充了所有位置),则将当前排列添加到结果中if (first == len) {  // 使用emplace_back直接在res的末尾构造一个output的副本res.emplace_back(output);  return;  }  // 从first开始,遍历所有未确定位置的元素for (int i = first; i < len; ++i) {  // 将当前位置的元素与first位置的元素交换,// 这样可以尝试将不同的元素放在first位置  swap(output[i], output[first]);  // 递归地处理下一个位置(first+1)backtrack(res, output, first + 1, len);  // 回溯,撤销上一步的交换,以便尝试其他可能性swap(output[i], output[first]);  }  }  // 公开接口,用于生成给定数组nums的所有排列  // nums: 需要排列的整数数组  // 返回值: 包含所有排列的二维向量  vector<vector<int>> permute(vector<int>& nums) {  vector<vector<int>> res; // 初始化结果向量// 从第一个元素开始回溯,直到处理完所有元素    backtrack(res, nums, 0, (int)nums.size());return res; // 返回所有排列的集合  }  
};

在这里插入图片描述

// 迭代法实现子集枚举
class Solution {  
public:  // 用于临时存储当前子集的结果  vector<int> output;  // 用于存储所有子集的结果  vector<vector<int>> ans;  // 生成给定整数数组nums的所有子集  vector<vector<int>> subsets(vector<int>& nums) {  // 遍历所有可能的位掩码,从0到2^nums.size() - 1  // 每个位掩码都代表一个子集,其中1表示选择该位置的元素,0表示不选择  for (int mask = 0; mask < (1 << nums.size()); ++mask) {  // 清空output,为构建新的子集做准备  output.clear();  // 遍历nums中的每个元素及其对应的位掩码位  for (int i = 0; i < nums.size(); ++i) {  // 如果mask的第i位是1(即mask & (1 << i)不为0),则将nums[i]加入当前子集  if (mask & (1 << i)) {  output.push_back(nums[i]);  }  }  // 将构建好的子集添加到结果集中  ans.push_back(output);  }  // 返回包含所有子集的结果集  return ans;  }  
};// 递归法实现子集枚举
// class Solution {  
// public:  
//     vector<int> output; // 用于临时存储当前子集的结果  
//     vector<vector<int>> ans; // 用于存储所有子集的结果  //     // 回溯函数,从数组的第first个元素开始构建子集  
//     // first 表示当前正在处理的元素在nums中的索引  
//     // nums 是给定的整数数组  
//     void backtrack(int first, vector<int>& nums) {  
//         // 如果已经处理了nums中的所有元素,则将当前子集添加到结果集中  
//         if (first == nums.size()) {  
//             ans.push_back(output);  
//             return;  
//         }  //         // 选择当前元素加入子集  
//         output.push_back(nums[first]);  
//         // 递归处理下一个元素,继续构建子集  
//         backtrack(first + 1, nums);  //         // 回溯,撤销选择当前元素,尝试不包含当前元素的情况  
//         output.pop_back();  
//         backtrack(first + 1, nums); 
//     }  //     // 主函数,用于生成nums的所有子集  
//     vector<vector<int>> subsets(vector<int>& nums) {  
//         backtrack(0, nums);  
//         return ans;  
//     }  
// }; 

在这里插入图片描述

class Solution {  
public:  // 主函数,用于生成给定数字字符串的所有字母组合  vector<string> letterCombinations(string digits) {  if (digits.empty()) { // 如果输入的数字字符串为空,则直接返回空的组合列表  return combinations;  }  string combination; // 用于存储当前正在构建的字母组合  vector<string> combinations; // 存储所有可能的字母组合  // 创建一个哈希表,将数字映射到它们对应的字母字符串  unordered_map<char, string> phoneMap{  {'2', "abc"},  {'3', "def"},  {'4', "ghi"},  {'5', "jkl"},  {'6', "mno"},  {'7', "pqrs"},  {'8', "tuv"},  {'9', "wxyz"}  };  // 调用回溯函数来生成所有可能的组合  backtrack(combinations, phoneMap, digits, 0, combination);  return combinations; // 返回所有生成的字母组合  }  // 回溯函数,用于递归地生成所有可能的字母组合  void backtrack(vector<string>& combinations, const unordered_map<char, string>& phoneMap, const string& digits, int index, string& combination) {  if (index == digits.length()) { // 如果已经处理完所有数字,则将当前组合添加到结果列表中  combinations.push_back(combination);  } else {  char digit = digits[index]; // 获取当前正在处理的数字  const string& letters = phoneMap.at(digit); // 从哈希表中获取该数字对应的字母字符串  for (const char& letter: letters) { // 遍历该数字对应的所有字母  combination.push_back(letter); // 将当前字母添加到当前组合中  // 递归调用回溯函数,处理下一个数字,同时传入更新后的组合  backtrack(combinations, phoneMap, digits, index + 1, combination);  combination.pop_back(); // 回溯,撤销上一步的添加操作,以便尝试下一个字母  }  }  }  
};

在这里插入图片描述

class Solution {  
public:  // 用于存储所有可能的组合结果的向量  vector<vector<int>> result;  // 用于在回溯过程中构建当前路径的向量  vector<int> path;  // 回溯函数,用于生成所有可能的组合  // candidates: 候选数字的集合  // target: 目标值,需要找到的和  // start: 从哪个候选数字开始考虑(避免重复使用相同的数字)  void backtrack(const vector<int>& candidates, int target, int start) {  // 如果当前目标和已经小于0,说明当前路径不可行,直接返回  if (target < 0) return;  // 如果目标和为0,说明找到了一个有效的组合,将其添加到结果中  if (target == 0) {  result.push_back(path);  return;  }  // 遍历候选数字,从start开始,确保不重复使用数字,并且当前数字不超过目标和  for (int i = start; i < candidates.size() && target - candidates[i] >= 0; i++) {  // 将当前数字添加到路径中  path.push_back(candidates[i]);  // 递归调用,目标值减去当前数字,start仍为i,因为可以重复使用相同的数字  // 注意:在某些问题中,可能需要将start改为i+1来避免重复使用相同的数字  backtrack(candidates, target - candidates[i], i);  // 回溯,撤销选择,继续尝试其他可能  path.pop_back();  }  }  // 主函数,用于找到所有可以使数字和为target的组合  // candidates: 候选数字的集合  // target: 目标值  // 返回值: 所有可能的组合  vector<vector<int>> combinationSum(vector<int>& candidates, int target) {  // 对候选数字进行排序,这有助于在回溯过程中剪枝,提高效率  // 特别是当允许重复使用数字时,排序可以确保较小的数字先被考虑  sort(candidates.begin(), candidates.end());  // 调用回溯函数开始搜索  backtrack(candidates, target, 0);  // 返回所有找到的组合  return result;  }  
};

在这里插入图片描述

class Solution {  // 回溯函数,用于生成所有有效的括号组合  // result: 存储所有有效括号组合的字符串向量  // current: 当前正在构建的括号字符串  // left: 当前已使用的左括号数量  // right: 当前已使用的右括号数量  // n: 目标括号对的数量  void backtrack(vector<string>& result, string& current, int left, int right, int n) {  // 如果当前括号字符串的长度达到了目标长度(n对括号即2n个字符)  // 则将其添加到结果向量中  if (current.size() == n * 2) {  result.push_back(current);  return;  }  // 如果还可以添加左括号(即左括号数量小于n)  if (left < n) {  current.push_back('('); // 添加左括号  backtrack(result, current, left + 1, right, n); // 递归调用,左括号数量+1  current.pop_back(); // 回溯,撤销上一步的操作  }  // 如果右括号数量小于左括号数量(保证括号的有效性)  if (right < left) {  current.push_back(')'); // 添加右括号  backtrack(result, current, left, right + 1, n); // 递归调用,右括号数量+1  current.pop_back(); // 回溯,撤销上一步的操作  }  }  public:  // 生成所有可能的、且有效的括号组合的公共接口  // n: 括号对的数量  vector<string> generateParenthesis(int n) {  vector<string> result; // 存储结果的向量  string current; // 当前正在构建的括号字符串  backtrack(result, current, 0, 0, n); // 从无括号开始,调用回溯函数  return result; // 返回所有有效的括号组合  }  
};// class Solution {
//     bool valid(const string& str) {
//         int balance = 0;
//         for (char c: str) {
//             if (c == '(') {
//                 ++balance;
//             } else {
//                 --balance;
//             }
//             if (balance < 0) {
//                 return false;
//             }
//         }
//         return balance == 0;
//     }//     void backtrack(string& current, int n, vector<string>& result) {
//         if (n == current.size()) {
//             if (valid(current)) {
//                 result.push_back(current);
//             }
//             return;
//         }
//         current += '(';
//         backtrack(current, n, result);
//         current.pop_back();
//         current += ')';
//         backtrack(current, n, result);
//         current.pop_back();
//     }
// public:
//     vector<string> generateParenthesis(int n) {
//         vector<string> result;
//         string current;
//         backtrack(current, n * 2, result);
//         return result;
//     }
// };

在这里插入图片描述

class Solution {  
public:  // 判断给定单词是否可以通过在棋盘board上相邻位置上的字母连接而成  bool exist(vector<vector<char>>& board, string word) {  // 遍历棋盘上的每一个位置作为起始点  for (int i = 0; i < board.size(); i++) {  for (int j = 0; j < board[0].size(); j++) {  // 为每个起始点创建一个访问标记矩阵,初始都为false  vector<vector<bool>> visited(board.size(), vector<bool>(board[0].size(), false));  // 从当前位置开始,尝试深度优先搜索以找到单词  if (dfs(board, visited, word, 0, i, j)) return true; // 如果找到单词,则返回true  }  }  // 如果遍历完所有起始点都没有找到单词,则返回false  return false;  }  private:  // 深度优先搜索函数,尝试在棋盘上找到单词  bool dfs(vector<vector<char>>& board, vector<vector<bool>>& visited, const string& word, int str_index, int i, int j) {  // 如果已经匹配完单词的所有字符,说明找到了单词,返回true  if (str_index == word.size()) return true;  // 检查当前位置是否越界、是否已访问过、或者是否与单词的当前字符不匹配  // 如果任何一个条件不满足,则无法继续搜索,返回false  if (i >= board.size() || i < 0 ||  j >= board[0].size() || j < 0 ||  visited[i][j] == true || board[i][j] != word[str_index]) return false;  // 标记当前位置为已访问  visited[i][j] = true;  // 尝试向上、下、左、右四个方向搜索  // 如果在任何一个方向上找到了单词,则返回true  if (dfs(board, visited, word, str_index + 1, i + 1, j) ||  // 向右  dfs(board, visited, word, str_index + 1, i - 1, j) ||  // 向左  dfs(board, visited, word, str_index + 1, i, j + 1) ||  // 向下  dfs(board, visited, word, str_index + 1, i, j - 1)) return true; // 向上  // 如果四个方向都没有找到单词,则回溯,将当前位置标记为未访问  visited[i][j] = false;  // 返回false,表示以当前位置为起始点没有找到单词  return false;  }  
};

在这里插入图片描述

class Solution {  
private:  // f是一个二维动态数组,用于存储字符串s中任意子串[i, j]是否为回文串的布尔值  vector<vector<int>> dp;  // result是一个二维字符串向量,用于存储所有满足条件的分割结果,每个内部向量代表一种分割方式  vector<vector<string>> result;  // answer是一个字符串向量,用于在DFS过程中临时存储当前的分割结果  vector<string> answer;  // n表示字符串s的长度  int n;  public:   // 深度优先搜索函数,用于遍历所有可能的分割方式  // s是当前处理的字符串,i是当前遍历到的起始位置  void dfs(const string& s, int i) {  // 如果遍历到了字符串的末尾,说明找到了一种分割方式,将其添加到结果中  if (i == n) {  result.push_back(answer);  return;  }  // 从当前位置i开始,尝试所有可能的分割点j  for (int j = i; j < n; ++j) {  // 如果子串[i, j]是回文串,则进行下一步分割  if (dp[i][j]) {  // 将当前回文子串添加到答案中  answer.push_back(s.substr(i, j - i + 1));  // 递归调用dfs,从j+1位置开始继续搜索  dfs(s, j + 1);  // 回溯,移除刚刚添加的回文子串,以尝试其他可能的分割  answer.pop_back();  }  }  }  // partition函数是类的公开接口,用于找到并返回所有满足条件的分割方式  vector<vector<string>> partition(string s) {  // 初始化n为字符串s的长度  n = s.size();  // 初始化f数组,默认所有子串都是回文串(之后会通过动态规划更新)  dp.assign(n, vector<int>(n, true));  // 使用动态规划计算f数组,即判断所有子串是否为回文串  for (int i = n - 1; i >= 0; --i) {  for (int j = i; j < n; ++j) {  // 如果首尾字符相等且去掉首尾后的子串也是回文串,则当前子串是回文串  dp[i][j] = (s[i] == s[j] && (j - i <= 1 || dp[i + 1][j - 1]));  }  }  // 从字符串的起始位置开始,使用深度优先搜索遍历所有可能的分割方式  dfs(s, 0);  // 返回所有满足条件的分割结果  return result;  }  
};

在这里插入图片描述

class Solution {  
private:  // 用于存储所有有效的N皇后解决方案  vector<vector<string>> result;  // 回溯函数,尝试在每一行放置皇后,并递归地处理下一行  void backtracking(int n, int row, vector<string>& chessboard) {  // 如果已经处理完所有行,说明找到了一个有效的解决方案,将其添加到结果中  if (row == n) {  result.push_back(chessboard);  return;  }  // 遍历当前行的每一列  for (int col = 0; col < n; col++) {  // 检查在当前位置放置皇后是否有效  if (isvalid(row, col, chessboard, n)) {  // 在当前位置放置皇后  chessboard[row][col] = 'Q';  // 递归处理下一行  backtracking(n, row + 1, chessboard);  // 回溯,撤销在当前位置放置的皇后  chessboard[row][col] = '.';  }  }  }  // 检查在(row, col)位置放置皇后是否有效  // 有效的条件是当前位置所在列、左上方对角线、右上方对角线上没有皇后  bool isvalid(int row, int col, vector<string>& chessboard, int n) {  // 检查列上是否有皇后  for (int i = 0; i < row; i++) {  if (chessboard[i][col] == 'Q') {  return false;  }  }  // 检查左上方对角线上是否有皇后  for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {  if (chessboard[i][j] == 'Q') {  return false;  }  }  // 检查右上方对角线上是否有皇后  for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {  if (chessboard[i][j] == 'Q') {  return false;  }  }  // 如果没有冲突,则当前位置有效  return true;  }  public:  // 主函数,用于解决N皇后问题  // 返回所有有效的N皇后解决方案  vector<vector<string>> solveNQueens(int n) {  // 清除之前的结果  result.clear();  // 初始化棋盘,所有位置都是'.'  vector<string> chessboard(n, string(n, '.'));  // 从第一行开始回溯  backtracking(n, 0, chessboard);  // 返回所有有效的解决方案  return result;  }  
};

相关文章:

LeetCode 每周算法 6(图论、回溯)

LeetCode 每周算法 6&#xff08;图论、回溯&#xff09; 图论算法&#xff1a; class Solution: def dfs(self, grid: List[List[str]], r: int, c: int) -> None: """ 深度优先搜索函数&#xff0c;用于遍历并标记与当前位置(r, c)相连的所有陆地&…...

Selenium元素定位:深入探索与实践

目录 一、引言 二、Selenium元素定位基础 1. WebDriver与元素定位 2. 定位策略概览 三、ID定位 1. 特点与优势 2. 示例代码 四、Class Name定位 1. 特点与限制 2. 示例代码 五、XPath定位 1. 特点与优势 2. 示例代码 3. XPath高级用法 六、CSS Selector定位 1.…...

前端开发——(1)使用vercel进行网页开发

前端开发——&#xff08;1&#xff09;使用Vercel进行网页开发 在现代前端开发中&#xff0c;选择一个高效的部署平台至关重要。Vercel 提供了快速、简便的部署方式&#xff0c;特别适合静态网站和 Next.js 应用。本文将带你逐步了解如何使用 Vercel 部署并运行你的网页项目。…...

故障诊断│GWO-DBN灰狼算法优化深度置信网络故障诊断

1.引言 随着人工智能技术的快速发展&#xff0c;深度学习已经成为解决复杂问题的热门方法之一。深度置信网络&#xff08;DBN&#xff09;作为深度学习中应用比较广泛的一种算法&#xff0c;被广泛应用于分类和回归预测等问题中。然而&#xff0c;DBN的训练过程通常需要大量的…...

【工具】Windows|两款开源桌面窗口管理小工具Deskpins和WindowTop

总结 Deskpins 功能单一&#xff0c;拖到窗口上窗口就可以置顶并且标记钉子标签&#xff0c;大小 104 KB&#xff0c;开源位置&#xff1a;https://github.com/thewhitegrizzli/DeskPins/releases WindowTop 功能完善全面强大&#xff0c;包括透明度、置顶、选区置顶等一系列功…...

【Unity杂谈】iOS 18中文字体显示问题的调查

一、问题现象 最近苹果iOS 18系统正式版推送&#xff0c;周围升级系统的同事越来越多&#xff0c;有些同事发现&#xff0c;iOS 18上很多游戏&#xff08;尤其是海外游戏&#xff09;的中文版&#xff0c;显示的字很奇怪&#xff0c;就像一些字被“吞掉了”&#xff0c;无法显示…...

后端-navicat查找语句(单表与多表)

表格字段设置如图 语句&#xff1a; 1.输出 1.输出name和age列 SELECT name,age from student 1.2.全部输出 select * from student 2.where子语句 1.运算符&#xff1a; 等于 >大于 >大于等于 <小于 <小于等于 ! <>不等于 select * from stude…...

基于springboot的在线视频点播系统

文未可获取一份本项目的java源码和数据库参考。 国外研究现状&#xff1a; 与传统媒体不同的是&#xff0c;新媒体在理念和应用上都采用了新颖的媒介或媒体。新媒体是指应用在数字技术、在传统媒体基础上改造、或者更新换代而来的媒介或媒体。新兴媒体与传统媒体在理念和应用…...

笔记整理—内核!启动!—kernel部分(8)动态编译链接库与BSP文件

linux的C语言程序是用编译的&#xff0c;但是如果要在开发板上运行的话就不能使用默认的ubuntu提供的gcc编译器&#xff0c;而是使用arm-linux版本的一类的编译器。我们可以用file xx去查看一个程序的架构。 &#xff08;arm架构&#xff09; &#xff08;intel的80386架构&…...

Cpp类和对象(中续)(5)

文章目录 前言一、赋值运算符重载运算符重载赋值运算符重载赋值运算符不可重载为全局函数前置和后置的重载 二、const修饰成员函数三、取地址及const取地址操作符重载四、日期类的实现构造函数日期 天数日期 天数日期 - 天数日期 - 天数日期类的大小比较日期类 > 日期类日…...

深度学习02-pytorch-01-张量的创建

深度学习 pytorch 框架 是目前最热门的。 深度学习 pytorch 框架相当于 机器学习阶段的 numpy sklearn 它将数据封装成张量(Tensor)来进行处理&#xff0c;其实就是数组。也就是numpy 里面的 ndarray . pip install torch1.10.0 -i https://pypi.tuna.tsinghua.edu.cn/simp…...

pg入门9—pg中的extentions是什么

在 PostgreSQL&#xff08;PG&#xff09;中&#xff0c;Extension&#xff08;扩展&#xff09; 是一组预先打包的功能模块&#xff0c;可以轻松地添加到数据库中以扩展其功能。这些扩展通常包含新的数据类型、函数、索引方法、操作符以及其他数据库增强功能。通过扩展&#x…...

JAVA:Nginx(轻量级的Web服务器、反向代理服务器)--(1)

一、Nginx:起因 nginx为什么为开发出来,起因是什么 总述:NGINX 的开发起因源于上世纪 90 年代末至 2000 年代初的互联网快速发展。当时,互联网流量急剧增长,特别是像 Apache 这样的传统 Web 服务器在高并发连接处理方面开始显现出瓶颈。 举例子:Apache 的 "每个连接…...

互斥锁和自旋锁

1、锁&#xff1a; 自旋锁与‌互斥锁的区别主要体现在以下几个方面&#xff1a; 1. 实现方式 ‌互斥锁‌&#xff1a;属于‌sleep-waiting类型的锁。当一个线程尝试获取已被其他线程持有的互斥锁时&#xff0c;该线程会被阻塞&#xff08;进入睡眠状态&#xff09;&#xff…...

救生圈检测系统源码分享

救生圈检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…...

容器技术--Dockerfile 构建镜像

Dockerfile dockerfile 是一系列命令&参数构成的脚本,这些命令应用于基础镜像,最终创建一个新的镜像,可以提供一致的运行环境。【也可以登录容器,自己安装软件,最后commit为镜像】 命令 FROM 指定基础镜像(必须),如FROM ubuntu;每一个指令就生成一层镜像;RUN 运…...

Hive企业级调优[5]—— HQL语法优化之数据倾斜

目录 HQL语法优化之数据倾斜 数据倾斜概述 分组聚合导致的数据倾斜 优化说明 优化案例 Join导致的数据倾斜 优化说明 优化案例 HQL语法优化之数据倾斜 数据倾斜概述 数据倾斜问题通常指的是参与计算的数据分布不均&#xff0c;即某个key或某些key的数据量远超其他key&#xff…...

表示速度的speed与velocity语义辨析

speed 对应的中文是 速度, 比如 5KM/h, 但是语义中不带方向&#xff0c;所以一般用来表示标量(scalar)。velocity 对应的中文也是 速度, 比如 5KM/h, 语义中蕴含了方向&#xff0c; 常用于表示向量(vector)。 2024年09月22日...

Electron 图标修改

目录 1. 图片基本要求 2. 在main.js中配置icon 位置 ​3. 在package.json 中配置icon 位置 4. 问题&#xff1a;左上角图片 开发环境下显示&#xff0c;生产环境下不显示 1. 图片基本要求 图片格式为ico&#xff0c;图片像素像素为256*256&#xff1b; 将ico文件放在pub…...

项目扩展二:消息拉取功能的实现

项目扩展二&#xff1a;消息拉取功能的实现 一、回顾一下消息推送功能是如何实现的二、设计消息拉取功能1.服务器如何处理2.定义Request和Response1.定义Request2.proto文件 三、服务器实现消息拉取1.业务模块的实现&#xff1a;信道模块2.消费者管理模块实现O(1)获取消费者1.目…...

2026 AI大模型岗位薪资全曝光:从30k到80w,程序员必备指南,非常详细收藏我这一篇就够了

文章主要展示了2026年AI领域热门岗位的薪资情况&#xff0c;包括华为、腾讯、联影等公司在多个城市的AI工程师、大模型算法等职位的薪资水平。数据显示AI人才市场需求旺盛&#xff0c;薪资从月薪3.6万到年包80万不等。文章提供了AI薪资专场的链接&#xff0c;邀请读者了解更多行…...

深入解析 Linux 内核中的 PCI 中断向量分配机制:pci_alloc_irq_vectors

1. PCI中断向量分配机制入门指南 第一次接触PCI设备中断处理时&#xff0c;我被各种专业术语搞得晕头转向。直到在项目里实际调试一个网卡驱动时&#xff0c;才真正理解pci_alloc_irq_vectors这个函数的重要性。想象一下&#xff0c;你的电脑就像个繁忙的快递分拣中心&#xf…...

3天快速掌握RCWA光学仿真:从零到一的完整高效指南

3天快速掌握RCWA光学仿真&#xff1a;从零到一的完整高效指南 【免费下载链接】Rigorous-Coupled-Wave-Analysis modules for semi-analytic fourier series solutions for Maxwells equations. Includes transfer-matrix-method, plane-wave-expansion-method, and rigorous c…...

Unity引擎开发过的VR大场景项目网络技术,资源处理及热更新方案的报价大概多少

根据最新的市场招标数据、行业报价案例和技术方案分析&#xff0c;针对VR大场景项目的网络技术、资源处理、热更新方案三大模块的报价&#xff0c;整理如下&#xff1a;一、网络技术方案报价 网络技术方案主要解决多人在线同步、远程渲染、低延迟通信等问题。方案类型技术选型报…...

GLM-OCR场景应用:教育资料数字化、商务文档信息抽取实战

GLM-OCR场景应用&#xff1a;教育资料数字化、商务文档信息抽取实战 1. 引言&#xff1a;文档智能化的时代需求 在信息爆炸的今天&#xff0c;我们每天都要处理大量纸质文档和电子文件。教育机构需要将历年试卷数字化归档&#xff0c;企业财务部门要处理堆积如山的发票和合同…...

python基于微信小程序的直播带货商品数据分析系统的爬虫可视化

目录需求分析与系统架构设计微信小程序数据爬取方案数据存储与清洗数据分析与可视化系统集成与部署注意事项项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作需求分析与系统架构设计 明确系统目标为爬取微信小程序直播带货商品数…...

python基于微信小程序的智慧社区娱乐服务管理平台

目录需求分析与规划技术架构设计功能模块开发实时交互实现数据可视化测试与部署安全与优化迭代计划项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作需求分析与规划 明确平台核心功能&#xff1a;居民活动报名、场地预约、社区公…...

Mojo 1.2正式版发布后,Python互操作API发生3处破坏性变更——紧急迁移指南与向下兼容降级方案(含自动转换脚本)

第一章&#xff1a;Mojo 1.2互操作API破坏性变更全景概览Mojo 1.2 版本对与 Python、C/C 及系统原生库的互操作接口进行了深度重构&#xff0c;核心目标是提升类型安全性和运行时性能&#xff0c;但由此引入了多项不兼容的破坏性变更。开发者在升级至 1.2 时必须审慎评估现有绑…...

lite-avatar形象库入门:如何查找、预览并下载心仪的数字人形象

lite-avatar形象库入门&#xff1a;如何查找、预览并下载心仪的数字人形象 1. 数字人形象库简介 在数字人项目开发中&#xff0c;一个合适的虚拟形象往往能让用户体验大幅提升。lite-avatar形象库正是为解决这一需求而生的专业资源库。 这个基于HumanAIGC-Engineering/LiteA…...

汽车电子测试人的 Prompt 工程

专栏&#xff1a;《AI 汽车电子测试实战》第 17 篇 作者&#xff1a;一线汽车电子测试工程师 适合人群&#xff1a;所有使用 AI 的测试工程师、想提升 AI 使用效率的测试人员开篇&#xff1a;为什么需要学 Prompt&#xff1f; 这是我上个月在某车企的 AI 培训项目中的真实经历。…...