第 84 场周赛:翻转图像、字符串中的查找与替换、图像重叠、树中距离之和
Q1、[简单] 翻转图像
1、题目描述
给定一个 n x n
的二进制矩阵 image
,先 水平 翻转图像,然后 反转 图像并返回 结果 。
水平翻转图片就是将图片的每一行都进行翻转,即逆序。
- 例如,水平翻转
[1,1,0]
的结果是[0,1,1]
。
反转图片的意思是图片中的 0
全部被 1
替换, 1
全部被 0
替换。
- 例如,反转
[0,1,1]
的结果是[1,0,0]
。
示例 1:
输入:image = [[1,1,0],[1,0,1],[0,0,0]] 输出:[[1,0,0],[0,1,0],[1,1,1]] 解释:首先翻转每一行: [[0,1,1],[1,0,1],[0,0,0]];然后反转图片: [[1,0,0],[0,1,0],[1,1,1]]
示例 2:
输入:image = [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]] 输出:[[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]] 解释:首先翻转每一行: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]];然后反转图片: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
提示:
n == image.length
n == image[i].length
1 <= n <= 20
images[i][j]
==0
或1
.
2、解题思路
- 水平翻转:
- 对于每一行,将其元素逆序排列。例如,
[1,1,0]
变为[0,1,1]
。
- 对于每一行,将其元素逆序排列。例如,
- 反转:
- 对于每个元素,如果是
0
,则替换为1
;如果是1
,则替换为0
。
- 对于每个元素,如果是
- 合并操作:
- 在水平翻转的同时,直接对元素进行反转,避免额外的遍历。
3、代码实现
C++
class Solution {
public:vector<vector<int>> flipAndInvertImage(vector<vector<int>>& image) {int n = image.size(); // 获取矩阵的大小vector<vector<int>> ret(n, vector<int>(n)); // 创建结果矩阵for (int i = 0; i < n; ++i) { // 遍历每一行for (int j = 0; j < n; ++j) { // 遍历每一列// 水平翻转:取 image[i][n - j - 1]// 反转:对结果取反ret[i][j] = !image[i][n - j - 1];}}return ret; // 返回结果矩阵}
};
Java
class Solution {public int[][] flipAndInvertImage(int[][] image) {int n = image.length; // 获取矩阵的大小int[][] ret = new int[n][n]; // 创建结果矩阵for (int i = 0; i < n; i++) { // 遍历每一行for (int j = 0; j < n; j++) { // 遍历每一列// 水平翻转:取 image[i][n - j - 1]// 反转:对结果取反ret[i][j] = 1 - image[i][n - j - 1];}}return ret; // 返回结果矩阵}
}
Python
class Solution:def flipAndInvertImage(self, image: List[List[int]]) -> List[List[int]]:n = len(image) # 获取矩阵的大小ret = [[0] * n for _ in range(n)] # 创建结果矩阵for i in range(n): # 遍历每一行for j in range(n): # 遍历每一列# 水平翻转:取 image[i][n - j - 1]# 反转:对结果取反ret[i][j] = 1 - image[i][n - j - 1]return ret # 返回结果矩阵
4、复杂度分析
-
时间复杂度:
- 遍历矩阵的每个元素,时间复杂度为 O(n2)。
-
空间复杂度:
- 创建结果矩阵,空间复杂度为 O(n2)。
Q2、[中等] 字符串中的查找与替换
1、题目描述
你会得到一个字符串 s
(索引从 0 开始),你必须对它执行 k
个替换操作。替换操作以三个长度均为 k
的并行数组给出:indices
, sources
, targets
。
要完成第 i
个替换操作:
- 检查 子字符串
sources[i]
是否出现在 原字符串s
的索引indices[i]
处。 - 如果没有出现, 什么也不做 。
- 如果出现,则用
targets[i]
替换 该子字符串。
例如,如果 s = "abcd"
, indices[i] = 0
, sources[i] = "ab"
, targets[i] = "eee"
,那么替换的结果将是 "eeecd"
。
所有替换操作必须 同时 发生,这意味着替换操作不应该影响彼此的索引。测试用例保证元素间不会重叠 。
- 例如,一个
s = "abc"
,indices = [0,1]
,sources = ["ab","bc"]
的测试用例将不会生成,因为"ab"
和"bc"
替换重叠。
在对 s
执行所有替换操作后返回 结果字符串 。
子字符串 是字符串中连续的字符序列。
示例 1:
输入:s = "abcd", indices = [0,2], sources = ["a","cd"], targets = ["eee","ffff"] 输出:"eeebffff" 解释: "a" 从 s 中的索引 0 开始,所以它被替换为 "eee"。 "cd" 从 s 中的索引 2 开始,所以它被替换为 "ffff"。
示例 2:
输入:s = "abcd", indices = [0,2], sources = ["ab","ec"], targets = ["eee","ffff"] 输出:"eeecd" 解释: "ab" 从 s 中的索引 0 开始,所以它被替换为 "eee"。 "ec" 没有从原始的 S 中的索引 2 开始,所以它没有被替换。
提示:
1 <= s.length <= 1000
k == indices.length == sources.length == targets.length
1 <= k <= 100
0 <= indices[i] < s.length
1 <= sources[i].length, targets[i].length <= 50
s
仅由小写英文字母组成sources[i]
和targets[i]
仅由小写英文字母组成
2、解题思路
-
问题分析:
- 我们需要对字符串
s
执行多个替换操作。 - 每个替换操作由
indices[i]
,sources[i]
,targets[i]
定义。 - 替换操作必须同时发生,且不会相互影响。
- 我们需要对字符串
-
算法设计:
- 使用哈希表记录每个索引对应的替换操作。
- 遍历字符串
s
,对于每个字符,检查是否有替换操作需要执行。 - 如果有替换操作,则检查
sources[i]
是否匹配,如果匹配则替换为targets[i]
,否则保留原字符。
-
优化:
-
使用哈希表快速查找每个索引的替换操作。
-
在遍历字符串时,直接跳过已替换的部分。
-
3、代码实现
C++
class Solution {
public:string findReplaceString(string s, vector<int>& indices, vector<string>& sources, vector<string>& targets) {int n = s.size(), m = indices.size(); // 获取字符串和操作数组的长度unordered_map<int, vector<int>>ops; // 哈希表, 记录每个索引对应的替换操作for (int i = 0; i < m; ++i) {ops[indices[i]].push_back(i); // 将操作索引加入哈希表}string ret; // 存储结果字符串for (int i = 0; i < n;) {bool succeed = false; // 标记是否成功执行替换if (ops.count(i)) // 如果当前索引有替换操作{for (int pt : ops[i]) // 遍历所有替换操作{if (s.substr(i, sources[pt].size()) == sources[pt]) // 检查 sources[pt] 是否匹配{succeed = true; // 标记成功ret += targets[pt]; // 替换为 targets[pt]i += sources[pt].size(); // 跳过已替换的部分break;}}}if (!succeed) // 如果没有执行替换{ret += s[i]; // 保留原字符++i; // 移动到下一个字符}}return ret;}
};
Java
class Solution {public String findReplaceString(String s, int[] indices, String[] sources, String[] targets) {int n = s.length(), m = indices.length; // 获取字符串和操作数组的长度Map<Integer, List<Integer>> ops = new HashMap<>(); // 哈希表,记录每个索引对应的替换操作for (int i = 0; i < m; i++) {ops.computeIfAbsent(indices[i], k -> new ArrayList<>()).add(i); // 将操作索引加入哈希表}StringBuilder ans = new StringBuilder(); // 存储结果字符串for (int i = 0; i < n;) { // 遍历字符串boolean succeed = false; // 标记是否成功执行替换if (ops.containsKey(i)) { // 如果当前索引有替换操作for (int pt : ops.get(i)) { // 遍历所有替换操作if (s.startsWith(sources[pt], i)) { // 检查 sources[pt] 是否匹配succeed = true; // 标记成功ans.append(targets[pt]); // 替换为 targets[pt]i += sources[pt].length(); // 跳过已替换的部分break; // 跳出循环}}}if (!succeed) { // 如果没有执行替换ans.append(s.charAt(i)); // 保留原字符i++; // 移动到下一个字符}}return ans.toString(); // 返回结果字符串}
}
Python
class Solution:def findReplaceString(self, s: str, indices: List[int], sources: List[str], targets: List[str]) -> str:n, m = len(s), len(indices) # 获取字符串和操作数组的长度ops = {} # 哈希表,记录每个索引对应的替换操作for i in range(m):if indices[i] not in ops:ops[indices[i]] = []ops[indices[i]].append(i) # 将操作索引加入哈希表ans = [] # 存储结果字符串i = 0while i < n: # 遍历字符串succeed = False # 标记是否成功执行替换if i in ops: # 如果当前索引有替换操作for pt in ops[i]: # 遍历所有替换操作if s.startswith(sources[pt], i): # 检查 sources[pt] 是否匹配succeed = True # 标记成功ans.append(targets[pt]) # 替换为 targets[pt]i += len(sources[pt]) # 跳过已替换的部分break # 跳出循环if not succeed: # 如果没有执行替换ans.append(s[i]) # 保留原字符i += 1 # 移动到下一个字符return ''.join(ans) # 返回结果字符串
4、复杂度分析
-
时间复杂度:O(n+ml),其中 n 是字符串 s 的长度,m 是数组 indices 的长度,l 是数组 sources 和 targets 中字符串的平均长度。
-
空间复杂度:O(n+ml)。
Q3、[中等] 图像重叠
1、题目描述
给你两个图像 img1
和 img2
,两个图像的大小都是 n x n
,用大小相同的二进制正方形矩阵表示。二进制矩阵仅由若干 0
和若干 1
组成。
转换 其中一个图像,将所有的 1
向左,右,上,或下滑动任何数量的单位;然后把它放在另一个图像的上面。该转换的 重叠 是指两个图像 都 具有 1
的位置的数目。
请注意,转换 不包括 向任何方向旋转。越过矩阵边界的 1
都将被清除。
最大可能的重叠数量是多少?
示例 1:
输入:img1 = [[1,1,0],[0,1,0],[0,1,0]], img2 = [[0,0,0],[0,1,1],[0,0,1]] 输出:3 解释:将 img1 向右移动 1 个单位,再向下移动 1 个单位。两个图像都具有 1 的位置的数目是 3(用红色标识)。
示例 2:
输入:img1 = [[1]], img2 = [[1]] 输出:1
示例 3:
输入:img1 = [[0]], img2 = [[0]] 输出:0
提示:
n == img1.length == img1[i].length
n == img2.length == img2[i].length
1 <= n <= 30
img1[i][j]
为0
或1
img2[i][j]
为0
或1
2、解题思路
-
问题分析:
- 我们需要找到一种滑动方式,使得两个图像的重叠
1
的数量最大。 - 滑动操作可以看作是对一个图像进行平移,平移的范围是
[-n+1, n-1]
。
- 我们需要找到一种滑动方式,使得两个图像的重叠
-
算法设计:
- 使用一个二维数组
count
来记录所有可能的平移向量(dx, dy)
对应的重叠数量。 - 对于
img1
中的每个1
,计算它与img2
中的每个1
的平移向量(i-x, j-y)
,并在count
中累加对应的重叠数量。 - 最终,
count
中的最大值即为最大可能的重叠数量。
- 使用一个二维数组
-
优化:
- 使用
count
数组的大小为[2*n+1][2*n+1]
,以处理负的平移向量。
- 使用
3、代码实现
C++
class Solution {
public:int largestOverlap(vector<vector<int>>& img1, vector<vector<int>>& img2) {int n = img1.size(); // 获取矩阵的大小vector<vector<int>> count(2 * n + 1, vector<int>(2 * n + 1, 0)); // 记录平移向量的重叠数量for (int i = 0; i < n; ++i) // 遍历 img1 的每一行{for (int j = 0; j < n; ++j) // 遍历 img1 的每一列{if (img1[i][j] == 1) // 如果 img1[i][j] 是 1{for (int x = 0; x < n; ++x) // 遍历 img2 的每一行{for (int y = 0; y < n; ++y) // 遍历 img2 的每一列{if (img2[x][y] == 1) // 如果 img2[i][j] 是 1{// 计算平移向量 (i-x, j-y), 并累加对应的重叠数量count[i - x + n][j - y + n] += 1;}}}}}}int ret = 0; // 记录最大的重叠数for (const auto& row : count) { // 遍历 count 数组for (int v : row) {ret = max(ret, v); // 更新最大值}}return ret;}
};
Java
class Solution {public int largestOverlap(int[][] img1, int[][] img2) {int n = img1.length; // 获取矩阵的大小int[][] count = new int[2 * n + 1][2 * n + 1]; // 记录平移向量的重叠数量for (int i = 0; i < n; i++) { // 遍历 img1 的每一行for (int j = 0; j < n; j++) { // 遍历 img1 的每一列if (img1[i][j] == 1) { // 如果 img1[i][j] 是 1for (int x = 0; x < n; x++) { // 遍历 img2 的每一行for (int y = 0; y < n; y++) { // 遍历 img2 的每一列if (img2[x][y] == 1) { // 如果 img2[x][y] 是 1// 计算平移向量 (i-x, j-y), 并累加对应的重叠数量count[i - x + n][j - y + n] += 1;}}}}}}int ret = 0; // 记录最大的重叠数for (int[] row : count) { // 遍历 count 数组for (int v : row) {ret = Math.max(ret, v); // 更新最大值}}return ret; // 返回结果}
}
Python
class Solution:def largestOverlap(self, img1: List[List[int]], img2: List[List[int]]) -> int:n = len(img1) # 获取矩阵的大小count = [[0] * (2 * n + 1) for _ in range(2 * n + 1)] # 记录平移向量的重叠数量for i in range(n): # 遍历 img1 的每一行for j in range(n): # 遍历 img1 的每一列if img1[i][j] == 1: # 如果 img1[i][j] 是 1for x in range(n): # 遍历 img2 的每一行for y in range(n): # 遍历 img2 的每一列if img2[x][y] == 1: # 如果 img2[x][y] 是 1# 计算平移向量 (i-x, j-y), 并累加对应的重叠数量count[i - x + n][j - y + n] += 1ret = 0 # 记录最大的重叠数for row in count: # 遍历 count 数组for v in row:ret = max(ret, v) # 更新最大值return ret # 返回结果
4、复杂度分析
-
时间复杂度:
- 遍历
img1
和img2
的每个元素,时间复杂度为 O(N4),其中N
是矩阵的大小。
- 遍历
-
空间复杂度:
- 使用
count
数组记录平移向量的重叠数量,空间复杂度为 O(N2)。
- 使用
Q4、[困难] 树中距离之和
1、题目描述
给定一个无向、连通的树。树中有 n
个标记为 0...n-1
的节点以及 n-1
条边 。
给定整数 n
和数组 edges
, edges[i] = [ai, bi]
表示树中的节点 ai
和 bi
之间有一条边。
返回长度为 n
的数组 answer
,其中 answer[i]
是树中第 i
个节点与所有其他节点之间的距离之和。
示例 1:
输入: n = 6, edges = [[0,1],[0,2],[2,3],[2,4],[2,5]] 输出: [8,12,6,10,10,10] 解释: 树如图所示。 我们可以计算出 dist(0,1) + dist(0,2) + dist(0,3) + dist(0,4) + dist(0,5) 也就是 1 + 1 + 2 + 2 + 2 = 8。 因此,answer[0] = 8,以此类推。
示例 2:
输入: n = 1, edges = [] 输出: [0]
示例 3:
输入: n = 2, edges = [[1,0]] 输出: [1,1]
提示:
1 <= n <= 3 * 104
edges.length == n - 1
edges[i].length == 2
0 <= ai, bi < n
ai != bi
- 给定的输入保证为有效的树
2、解题思路
- 问题分析:
- 树是一个连通无向图,没有环。
- 我们需要计算每个节点到其他所有节点的距离之和。
- 算法设计:
- 使用 树形动态规划 的思想,通过两次深度优先搜索(DFS)来计算每个节点的距离和。
- 第一次 DFS:从根节点开始,计算每个节点的子树大小
sz
和子树中所有节点到当前节点的距离和dp
。 - 第二次 DFS:从根节点开始,利用第一次 DFS 的结果,计算每个节点到其他所有节点的距离和
ans
。
- 优化:
- 通过动态规划,避免重复计算,将时间复杂度优化到 O(n)。
3、代码实现
C++
class Solution {
private:vector<int> ret, sz, dp; // ret: 结果数组, sz: 子树大小, dp: 子树中所有节点到当前节点的距离和vector<vector<int>> graph; // 邻接表表示的树// 第一次 DFS: 计算子树大小 sz 和子树中所有节点到当前节点的距离和 dpvoid dfs1(int u, int f) {sz[u] = 1; // 当前节点的子树大小初始化为 1dp[u] = 0; // 当前节点的距离和初始化为 0// 遍历当前节点的所有邻居for (auto& v : graph[u]) {// 跳过父节点if (v == f) {continue;}dfs1(v, u); // 递归处理子节点dp[u] += dp[v] + sz[v]; // 更新当前节点的距离和sz[u] += sz[v]; // 更新当前节点的子树大小}}// 第二次 DFS: 计算每个节点到其他所有节点的距离和 ansvoid dfs2(int u, int f) {ret[u] = dp[u]; // 当前节点的距离和即为 dp[u]// 遍历当前节点的所有邻居for (auto& v : graph[u]) {// 跳过父节点if (v == f) {continue;}int pu = dp[u], pv = dp[v]; // 保存当前节点和子节点的 dp 值int su = sz[u], sv = sz[v]; // 保存当前节点和子节点的 sz 值// 将当前节点 u 从树中移除,重新计算 dp 和 szdp[u] -= dp[v] + sz[v];sz[u] -= sz[v];dp[v] += dp[u] + sz[u];sz[v] += sz[u];dfs2(v, u); // 递归处理子节点// 恢复 dp 和 sz 的值dp[u] = pu, dp[v] = pv;sz[u] = su, sz[v] = sv;}}public:vector<int> sumOfDistancesInTree(int n, vector<vector<int>>& edges) {ret.resize(n, 0); // 初始化结果数组sz.resize(n, 0); // 初始化字数大小数组dp.resize(n, 0); // 初始化距离和数组graph.resize(n, {}); // 初始化邻接表// 构建邻接表for (auto& edge : edges) {int u = edge[0], v = edge[1];graph[u].emplace_back(v);graph[v].emplace_back(u);}dfs1(0, -1); // 第一次 DFS, 以 0 为根节点dfs2(0, -1); // 第二次 DFS, 以 0 为根节点return ret;}
};
Java
class Solution {int[] ans, sz, dp; // ans: 结果数组, sz: 子树大小, dp: 子树中所有节点到当前节点的距离和List<List<Integer>> graph; // 邻接表表示的树// 第一次 DFS:计算子树大小 sz 和子树中所有节点到当前节点的距离和 dpprivate void dfs(int u, int f) {sz[u] = 1; // 当前节点的子树大小初始化为 1dp[u] = 0; // 当前节点的距离和初始化为 0for (int v : graph.get(u)) { // 遍历当前节点的所有邻居// 跳过父节点if (v == f) {continue;}dfs(v, u); // 递归处理子节点dp[u] += dp[v] + sz[v]; // 更新当前节点的距离和sz[u] += sz[v]; // 更新当前节点的子树大小}}// 第二次 DFS:计算每个节点到其他所有节点的距离和 ansprivate void dfs2(int u, int f) {ans[u] = dp[u]; // 当前节点的距离和即为 dp[u]for (int v : graph.get(u)) { // 遍历当前节点的所有邻居// 跳过父节点if (v == f) {continue;}int pu = dp[u], pv = dp[v]; // 保存当前节点和子节点的 dp 值int su = sz[u], sv = sz[v]; // 保存当前节点和子节点的 sz 值// 将当前节点 u 从树中移除,重新计算 dp 和 szdp[u] -= dp[v] + sz[v];sz[u] -= sz[v];dp[v] += dp[u] + sz[u];sz[v] += sz[u];dfs2(v, u); // 递归处理子节点// 恢复 dp 和 sz 的值dp[u] = pu;dp[v] = pv;sz[u] = su;sz[v] = sv;}}public int[] sumOfDistancesInTree(int n, int[][] edges) {ans = new int[n]; // 初始化结果数组sz = new int[n]; // 初始化子树大小数组dp = new int[n]; // 初始化距离和数组graph = new ArrayList<>(); // 初始化邻接表for (int i = 0; i < n; i++) {graph.add(new ArrayList<>());}for (int[] edge : edges) { // 构建邻接表int u = edge[0], v = edge[1];graph.get(u).add(v);graph.get(v).add(u);}dfs(0, -1); // 第一次 DFS,以 0 为根节点dfs2(0, -1); // 第二次 DFS,以 0 为根节点return ans; // 返回结果}
}
Python
class Solution:def sumOfDistancesInTree(self, n: int, edges: List[List[int]]) -> List[int]:self.ans = [0] * n # 结果数组self.sz = [0] * n # 子树大小数组self.dp = [0] * n # 子树中所有节点到当前节点的距离和self.graph = [[] for _ in range(n)] # 邻接表表示的树# 构建邻接表for u, v in edges:self.graph[u].append(v)self.graph[v].append(u)# 第一次 DFS:计算子树大小 sz 和子树中所有节点到当前节点的距离和 dpdef dfs(u, f):self.sz[u] = 1 # 当前节点的子树大小初始化为 1self.dp[u] = 0 # 当前节点的距离和初始化为 0for v in self.graph[u]: # 遍历当前节点的所有邻居if v == f: continue # 跳过父节点dfs(v, u) # 递归处理子节点self.dp[u] += self.dp[v] + self.sz[v] # 更新当前节点的距离和self.sz[u] += self.sz[v] # 更新当前节点的子树大小# 第二次 DFS:计算每个节点到其他所有节点的距离和 ansdef dfs2(u, f):self.ans[u] = self.dp[u] # 当前节点的距离和即为 dp[u]for v in self.graph[u]: # 遍历当前节点的所有邻居if v == f: continue # 跳过父节点pu, pv = self.dp[u], self.dp[v] # 保存当前节点和子节点的 dp 值su, sv = self.sz[u], self.sz[v] # 保存当前节点和子节点的 sz 值# 将当前节点 u 从树中移除,重新计算 dp 和 szself.dp[u] -= self.dp[v] + self.sz[v]self.sz[u] -= self.sz[v]self.dp[v] += self.dp[u] + self.sz[u]self.sz[v] += self.sz[u]dfs2(v, u) # 递归处理子节点# 恢复 dp 和 sz 的值self.dp[u], self.dp[v] = pu, pvself.sz[u], self.sz[v] = su, svdfs(0, -1) # 第一次 DFS,以 0 为根节点dfs2(0, -1) # 第二次 DFS,以 0 为根节点return self.ans # 返回结果
4、复杂度分析
- 时间复杂度:
- 两次 DFS 遍历所有节点和边,时间复杂度为 O(n)。
- 空间复杂度:
-
使用邻接表存储树,空间复杂度为 O(n)。
pu, pv = self.dp[u], self.dp[v] # 保存当前节点和子节点的 dp 值
su, sv = self.sz[u], self.sz[v] # 保存当前节点和子节点的 sz 值# 将当前节点 u 从树中移除,重新计算 dp 和 szself.dp[u] -= self.dp[v] + self.sz[v]self.sz[u] -= self.sz[v]self.dp[v] += self.dp[u] + self.sz[u]self.sz[v] += self.sz[u]dfs2(v, u) # 递归处理子节点# 恢复 dp 和 sz 的值self.dp[u], self.dp[v] = pu, pvself.sz[u], self.sz[v] = su, sv
dfs(0, -1) # 第一次 DFS,以 0 为根节点
dfs2(0, -1) # 第二次 DFS,以 0 为根节点
return self.ans # 返回结果
-
#### 4、复杂度分析1. **时间复杂度**:- 两次 DFS 遍历所有节点和边,时间复杂度为 O(n)。
2. **空间复杂度**:- 使用邻接表存储树,空间复杂度为 O(n)。<br>
<br>
相关文章:
第 84 场周赛:翻转图像、字符串中的查找与替换、图像重叠、树中距离之和
Q1、[简单] 翻转图像 1、题目描述 给定一个 n x n 的二进制矩阵 image ,先 水平 翻转图像,然后 反转 图像并返回 结果 。 水平翻转图片就是将图片的每一行都进行翻转,即逆序。 例如,水平翻转 [1,1,0] 的结果是 [0,1,1]。 反转…...
SkyReels-V2:开启无限时长电影生成新时代
AI 在视频生成领域的突破尤为引人注目,为内容创作带来了全新的可能性。而 SkyReels-V2 的问世,更是如同一场革命,彻底颠覆了人们对视频生成技术的认知,开启了无限时长电影生成的新时代。 一、背景与挑战 回顾视频生成技术的发展…...
教师可用的申报书——基于GAI的小学数学课堂跨学科支架设计与实践
课题申报书:基于GAI的小学数学课堂跨学科支架设计与实践 (一)立项依据与研究内容 1. 项目的立项依据 1.1 研究意义 2025年《教育强国建设规划纲要》明确提出“推动学科融合发展”,《信息化标准建设行动计划(2024-2027年)》强调技术赋能教育创新。小学数学作为基础学科,…...
79、modelsim单独仿真altera带IP核的文件
1.编译 quartus 仿真库(如果有就不用编译了) 编译完成后 sim 文件夹中产生一个 verilog_libs 文件夹,打开文件夹 以上便是编译产生的库,将库添加到 modelsim 中也就是观察此文件中的 modelsim.ini 与 modelsim 安装目录下此…...
将 Workbook 输出流直接上传到云盘
如果不想将 Excel 文件保存到本地,而是希望直接将输出流上传到云存储(如阿里云OSS、腾讯云COS、七牛云等),可以采用以下方法: 文章目录 1. 创建内存中的 Excel 输出流2. 上传到云存储的通用方法3. 具体云服务实现示例…...
【LINUX操作系统】日志系统——自己实现一个简易的日志系统
经过一段时间的操作系统的学习,现在是时候让读者朋友们利用学过的技术知识自己完成一个简单的日志系统。认识、了解日志系统既是对已有多线程知识的运用,也是进一步提升项目技术能力的必须步骤。 1. 什么是日志 ⽇志认识 计算机中的⽇志是记录系统和软件…...
HTML页面渲染过程
前言 文章很长,凡是我觉得好的东西统统都塞进来了。看了很多的文章,有些说法甚至都不统一,所以还动用了AI搜索。总之希望这篇文章能有点用,如有错误,欢迎指正。 浏览器介绍 浏览器的主要组件包括: 界面…...
【八股战神篇】Java虚拟机(JVM)高频面试题
目录 专栏简介 一 请解释Java虚拟机(JVM)及其主要功能 延伸 1. JVM的基本概念 2. JVM的主要功能 二 对象创建的过程了解吗 延伸 1.Java 创建对象的四种常见方式 三 什么是双亲委派模型 延伸 1.双亲委派机制的作用: 2.双亲委派模型…...
微店商品详情接口开发指南
接口概述 微店商品详情接口(/api/v1/product/detail)用于获取商品的完整信息,包括标题、价格、库存、SKU、主图等数据,支持OAuth2.0鉴权。 点击获取key和secret 请求方式 GET https://open.weidian.com/api/v1/product/detail …...
拦截指定注解(FeignClient),补偿重试
拦截指定注解(FeignClient),补偿重试;对代码无入侵 避免正常调用和重试逻辑调用重复插入; 根据自己的业务需求 插入新数据时 是否需要删除之前的旧数据,防止数据覆盖 import cn.hutool.core.util.ObjectUti…...
使用 GitHub Pages 部署单页面应用教程
## 简介 GitHub Pages 是 GitHub 提供的一个静态网站托管服务,可以免费托管个人、项目或组织页面。本教程将指导您如何部署一个单页面应用到 GitHub Pages。 ## 前提条件 - 拥有 GitHub 账号 - 已安装 Git - 已安装 Node.js(如果使用前端框架&#x…...
day16-17-磁盘管理
1. 磁盘分类 磁盘接口 硬盘 大小 sata接口 机械硬盘、固态硬盘 机械:4tb 10k性能要求不高 sas接口 机械硬盘、固态硬盘 机械:900G 15k性能好,容量低 pcie-e接口 固态硬盘 tb级别 4tb 8tb 性能要求高,数据库,…...
【神经网络与深度学习】扩散模型之通俗易懂的解释
引言: 扩散模型(Diffusion Models)是近年来深度学习领域的一项重要突破,尤其在生成式人工智能(Generative AI)中展现了惊人的能力。它的核心思想类似于一个孩子学习搭建乐高城堡的过程——先拆散࿰…...
Linux Bash 中 $? 的详细用法
Bash (Bourne Again SHell) 是使用最广泛的 SHell 脚本语言之一,因为它与 Unix 和 Linux 系统兼容。它提供了许多内置函数和变量,使脚本编写更高效,更不容易出错。其中一个变量是 $?, 它是 Bash 脚本错误处理的一个组成部分。这个…...
嵌入式培训之系统编程(一)标准IO、文件操作
目录 一、系统编程概述 二、标准IO (一)(以计算机为中心)标准IO (二)io的分类 (三)man命令 三、文件读写操作 (一)文件操作步骤 (二&#…...
NVIDIA Earth-2 AI 天气模型 DLI 课程:解锁全球风云的未来之匙
电影闲聊引发思索之言: 曾几何时,当我们闲聊起那些描绘美国气候的大电影时(龙卷风-后天等美国大片),仿佛被带入了一个个奇幻而真实的气象世界。从狂风暴雨到烈日炎炎最后到冰天雪地,电影里的场景让我们对气…...
至此(day1-day4)代码详解(ai辅助整理)
至此(day1-day4)代码详解 ipl10.nas ; 第一阶段引导程序 ; 功能:读取磁盘数据并跳转到第二阶段加载程序 ; 编译参数:nask -o ipl10.bin ipl10.nasCYLS EQU 10 ; 预设读取柱面数(实际值由BIOS决定)ORG…...
STM32F103_LL库+寄存器学习笔记12.2 - 串口DMA高效收发实战2:进一步提高串口接收的效率
导言 通过优化代码算法,在串口空闲中断回调里不需要暂时关闭DMA接收,达到提高串口接收的效率。在IDLE接收中断里关闭DMA接收会导致接收过程中有数据丢失风险(关DMA的瞬间如果有数据到来,会丢帧!)。 回顾一…...
conda 设置env后,环境还是安装在c盘的解决方式:
1|设置 envs 文件夹权限 右键【envs】文件夹,选择【属性】 选择【安全】,点击【编辑】 选中【Users(用户名\Users)】,选中运行所有权限,如图所示 点击【确认】,确保修改被保存 2、环境变量path设置 选择【高级系统设置…...
设计模式 - 工厂模式
简单工厂模式 public class CoffeeFactory {public Coffee get(string coffeeType) {Coffee coffee null;if ("American".equals(coffeeType)) {coffee new AmericanCoffee();} else if ("Latte".equals(coffeeType)) {coffee new LatteCoffee();}retur…...
动态规划-LCR 090.打家劫舍II-力扣(LeetCode)
一、题目解析 本题与打家劫舍的最大区别在于房子不是线性分布的了,而是首尾相连的环形分布,即如果偷了第一间房子,那么最后一间房子就不能偷了,因为它们是相连的。 二、算法原理 在分析之前我们可以先讨论上面提到的第一间房子偷…...
2025 年暑假 LBE 大空间市场火爆程度预测:技术驱动与消费升级下的增长引擎
一、市场爆发的底层逻辑 根据 DeepSeek 行业报告显示,2025 年 LBE 大空间市场将呈现结构性爆发,核心驱动力来自三大技术突破: 空间计算能力跃迁:上海移动已开通全球最大规模商用 5G-A 3CC 网络,主城区及十大重点场景…...
【AI 大模型】盘古大模型简介 ( 创建空间 | 体验模型 | 部署模型 )
文章目录 一、盘古大模型简介1、创建空间2、体验模型3、部署模型 总结 : 盘古大模型 是 开发部署 盘古基础模型 , 或 在 盘古模型 基础上进行 微调训练 的 大模型 的平台 , 是 开发训练 大模型的平台 ; 不适合 中小企业 和 个人开发者 开发 大模型应用 ; 一、盘古大模型简介 1、…...
2025年护网行动蓝队防御全解析:构建智能动态防御体系
2025年,随着网络攻击手段的智能化、混合化升级,护网行动中的蓝队防御已从传统的被动防护转向“动态感知、智能研判、主动反制”的立体化模式。如何在攻防不对称的对抗中实现“看得见、防得住、溯得清”?本文将结合前沿技术与实战经验…...
【Java高阶面经:微服务篇】3.熔断机制深度优化:从抖动治理到微服务高可用架构实战
一、熔断抖动的本质剖析与核心成因 1.1 熔断机制的核心价值与抖动危害 熔断机制作为微服务弹性架构的核心组件,通过模拟电路断路器逻辑,在服务出现异常时自动阻断请求链,防止故障扩散引发雪崩。但频繁的“熔断-恢复-熔断”抖动会导致: 用户体验恶化:请求成功率波动大,响…...
HTML回顾
html全称:HyperText Markup Language(超文本标记语言) 注重标签语义,而不是默认效果 规则 块级元素包括: marquee、div等 行内元素包括: span、input等 规则1:块级元素中能写:行内元素、块级元素(几乎什么都能写) 规则2:行级元素中能写:行内元素,但不能写:块…...
Leetcode百题斩-字典树
208. Implement Trie (Prefix Tree)[medium] 做完了哈希,来看看数据结构,做做字典树。字典树在搜索方面的作用还是蛮大的,主要是能实现前缀联想以及正确性匹配相关的功能。 字典树又名前缀树,顾名思义就是维护字符串的前缀。这个…...
大数据Spark(五十九):Standalone集群部署
文章目录 Standalone集群部署 一、节点划分 二、搭建Standalone集群 1、将下载好的Spark安装包上传解压 2、配饰spark-env.sh 3、配置workers 4、将配置好的安装包发送到node2、node3节点上 5、启动Standalone集群 三、提交任务测试 Standalone集群部署 Standalone 模…...
Vue 3 ~ 3.5 版本useTemplateRef使用
注意,useTemplateRef版本要在 3.5 以后才可使用,版本低的 ref 替代问题也不大~ 2024 年 9 月 1 日发布的 组合式 API:辅助 | Vue.js,引入一个小小的新 API useTemplateRef(),它用于访问实际的 DOM 节点。 …...
使用F5-tts复刻音色
最近第一人称视角的视频很火,想试试看复刻一下电视剧中某个角色的音色。看了下字节的API,嗯。。。138元一个音色,还不包括合成语音的费用,算了还是看看开源项目吧。 随便搜了搜,发现了两个项目一个是openvoice&#x…...
使用亮数据代理IP+Python爬虫批量爬取招聘信息训练面试类AI智能体(附完整源码)
文章目录 一、为什么要用代理IP?(重要!)二、环境准备(5分钟搞定)三、爬虫核心代码解析(含反反爬技巧)四、数据清洗的3个关键步骤五、训练AI智能体的实战技巧六、法律风险防范(必须看!…...
[软件工程]第二章题目汇总
1 [单选题] 原型化模型是( )。 A、适用于客户需求被明确定义的情况 B、很难产生有意义产品的一种冒险模型 C、提供一个精确表述的形式化规格说明 D、适用于客户需求难以清楚定义的情况 2 [单选题] 下列关于增量模型的说法正确的是( &…...
Java EE进阶1:导读
1.发展历程 2.学习内容 前⾯的课程中,学习的是Java基础,JavaEE主要学习Java的应用,也就是学习Java在企业中是如何应用的 Java更多场景是业务开发,更狭义点可以理解为web开发.所以咱们的学习也是围绕着如何使用Java来做web开发 2.1 什么是Web开发? web(…...
Unity自定义shader打包SpriteAtlas图集问题
Unity打包图集还是有一些坑的,至于图集SpriteAtlas是什么请参考我之前写的文章:【Sprite Atlas】Unity新图集系统SpriteAtlas超详细使用教程_spriteatlas 使用-CSDN博客 问题: 今天碰到的问题是,shader绘制的时候,因…...
系统集成项目管理工程师学习笔记之启动过程组
第十章 启动过程组 制定项目章程 定义 制定项目章程是编写一份正式批准项目并授权项目经理在项目活动中使用组织资源的文件的过程。 正式批准的项目文件 作用 1、明确项目与组织战略目标之间的直接联系 2、确立项目的正式地位 3、展示组织对项目的承诺 本过程仅开展一…...
vscode 常用调试
一、文件执行 python script.py {"name": "Python 调试程序: 当前文件","type": "debugpy","request": "launch","program": "${file}","console": "integratedTerminal"…...
Java 07异常
异常 指的是程序在编译和执行的过程中,出现的非正常的情况; 当然语法错误并不属于错误异常体系 最大的Throwable; 分为两个:Error ExceptionError 严重级别问题 常见的 堆内存溢出 栈内存溢出Exception 分为两个子类 RuntimeException 运…...
2025年PMP 学习二十三 16章 高级项目管理
2025年PMP 学习二十三 16章 高级项目管理 文章目录 2025年PMP 学习二十三 16章 高级项目管理高级项目管理战略管理战略管理的组成要素:企业战略转化为战略行动的阶段: 组织战略类型战略组织类型组织级项目管理OPM(公司项目管理) 组…...
【Java高阶面经:微服务篇】1.微服务架构核心:服务注册与发现之AP vs CP选型全攻略
一、CAP理论在服务注册与发现中的落地实践 1.1 CAP三要素的技术权衡 要素AP模型实现CP模型实现一致性最终一致性(Eureka通过异步复制实现)强一致性(ZooKeeper通过ZAB协议保证)可用性服务节点可独立响应(支持分区存活)分区期间无法保证写操作(需多数节点可用)分区容错性…...
ISCC 2025决赛 wp
PWN Dilemma 64位程序没有开启PIE,并且过滤了execve,不能使用system这些的了,所以要考虑ORW来做 进入main函数分析,这里有两个函数一个func_1一个func_2。 这两个函数都有漏洞,以下是详细分析: 对于func…...
C++(5)switch语句 循环while
这是一个电影评分的程序 default 就是 如果上述的都没有执行 就统一的执行default的内容。 然后记得break ___________________________________ 循环 (while) while的使用方式 输出 0-9的while循环...
操作系统----软考中级软件工程师(自用学习笔记)
目录 1、计算机系统层次结构 2、程序顺序执行的特征 3、程序并发执行的特征 4、三态模型 5、同步与互斥 6、信号量机制 7、PV操作 8、死锁 9、进程资源图 10、死锁避免 11、线程 12、程序局部性原理 13、分页存储管理 14、单缓冲器 15、双缓冲区 16、磁盘调度算…...
利用Spring Boot和Redis构建高性能缓存系统
利用Spring Boot和Redis构建高性能缓存系统 引言 在现代Web应用中,缓存是提升系统性能的关键技术之一。Redis作为一种高性能的内存数据库,广泛应用于缓存场景。本文将介绍如何利用Spring Boot和Redis构建一个高性能的缓存系统,涵盖Redis的基…...
每日一题:1、虚拟IPv4地址转换为32位整数(JS)
题目背景 我们需要处理一种特殊的虚拟IPv4地址,这种地址由4个小节组成,每节之间用#分隔。与标准IPv4地址不同,虚拟IPv4地址的第一节范围是1~128,后三节的范围是0~255。我们需要将这种虚拟IPv4地址转换为一个唯一的32位整数。如果…...
[Vue]组件介绍和父子组件间传值
组件介绍 Vue3的 .vue文件中的主要部分分别分为三个:<template>、<script>、<style> <template>: 结构,相当于原html中的<head><body><footer>部分。原本的index.html现在只做一个容器࿰…...
Vue3 中使用 provide/inject 实现跨层级组件传值失败的原因及解决方案
1、基础用法 父组件: <script setup> import { ref, provide } from vue; import ChildComponent from ./ChildComponent.vue; const parentData ref(初始数据); // 提供数据 provide(parentData, parentData); </script>子组件: <sc…...
Git Hooks 和 自动生成 Commit Message
前言: 企业编程必须始终依赖流程,而不是个人。个人能力很重要,应该鼓励,但不能指望它,否则软件质量将不一致,没有可持续性。一旦顶级程序员跳槽,公司就会陷入困境。企业应该努力改进工作流程&am…...
【小明剑魔视频Viggle AI模仿的核心算法组成】
Viggle AI 作为一款先进的生成式视频AI工具,其核心技术栈融合了多项前沿算法。以下是深度解析其核心算法架构及实现原理: 一、核心算法组成 1. 运动控制生成(Motion Control Generation) 算法框架:基于扩散模型&…...
Linux学习心得问题整理(二)
day05 Linux基础入门 Linux语法解析 如何理解ssh远程连接?如何使用ssh使用远程连接服务? ssh进也称远程服务终端,常见连接方式可以包括windows和Linux两种方式 首先咱们使用windows窗口进行连接,这里就采用xshell连接工具来给大家做演示吧…...
百度网盘加速补丁v7.14.1.6使用指南|PC不限速下载实操教程
软件介绍 本加速补丁可突破百度网盘限速限制,无需会员、无次数限制,实测下载速度可达带宽峰值。 三步极速配置教程 1. 环境准备 → 卸载电脑原有百度网盘客户端(避免冲突) → 关闭杀毒软件/安全卫士(防止误删补丁&am…...