第150场双周赛:好数字之和、分割正方形 Ⅰ、分割正方形 Ⅱ、最短匹配字符串
Q1、好数字之和
1、题目描述
给定一个整数数组 nums 和一个整数 k,如果元素 nums[i] 严格 大于下标 i - k 和 i + k 处的元素(如果这些元素存在),则该元素 nums[i] 被认为是 好 的。如果这两个下标都不存在,那么 nums[i] 仍然被认为是 好 的。
返回数组中所有 好 元素的 和。
2、解题思路
遍历 nums 数组,检查每个元素是否满足 好 元素的定义,满足条件就累加到结果 ret 中。
具体步骤:
- 初始化
ret = 0用于存储所有 好 元素的和。 - 遍历数组
nums,对每个元素nums[i]:- 如果
i - k不存在,则nums[i]只需满足nums[i] > nums[i + k](如果i + k存在)。 - 如果
i + k不存在,则nums[i]只需满足nums[i] > nums[i - k](如果i - k存在)。 - 如果
i - k和i + k都存在,则nums[i]需要满足:nums[i] > nums[i - k]nums[i] > nums[i + k]
- 满足条件的
nums[i]加入ret。
- 如果
- 返回
ret。
3、代码实现
class Solution {
public:int sumOfGoodNumbers(vector<int>& nums, int k) {int ret = 0; // 用于存储所有"好"元素的总和int n = nums.size(); // 数组长度// 遍历数组for (int i = 0; i < n; ++i) {// 检查 nums[i] 是否满足 "好" 元素的定义// 如果 i-k 不存在, 跳过检查; 否则 nums[i] > nums[i - k]// 如果 i+k 不存在, 跳过检查; 否则 nums[i] > nums[i + k]if ((i - k < 0 || nums[i] > nums[i - k]) && (i + k >= n || nums[i] > nums[i + k])) {ret += nums[i]; // 计算 "好" 元素的和}}return ret;}
};

4、复杂度分析
时间复杂度: O(n),因为我们只需要遍历 nums 一次,每个元素的检查都是 O(1) 。
空间复杂度: O(1),我们仅仅使用了一个额外变量 ret 存储结果。
Q2、分割正方形 Ⅰ
1、题目描述
给你一个二维整数数组 squares ,其中 squares[i] = [xi, yi, li] 表示一个与 x 轴平行的正方形的左下角坐标和正方形的边长。
找到一个最小的 y 坐标,它对应一条水平线,该线需要满足它以上正方形的总面积 等于 该线以下正方形的总面积。
答案如果与实际答案的误差在 10-5 以内,将视为正确答案。
注意:正方形 可能会 重叠。重叠区域应该被 多次计数 。
2、解题思路
1. 计算搜索范围
首先,我们需要确定 y 的 上下边界:
down(最小的 y):所有正方形左下角y的最小值。up(最大的 y):所有正方形的最高点y + l的最大值。
这样,答案 mid 必须在 down ~ up 之间。
2. 计算总面积
遍历所有正方形,计算它们的总面积:
totalArea = ∑ side 2 \text{totalArea} = \sum \text{side}^2 totalArea=∑side2
目标是找到一条水平线,使得:
上半部分面积 = 下半部分面积 = totalArea 2 \text{上半部分面积} = \text{下半部分面积} = \frac{\text{totalArea}}{2} 上半部分面积=下半部分面积=2totalArea
3. 二分查找水平线
二分查找 mid(即 y 轴上的某个水平线):
- 计算 该水平线以下的面积
areaBelow。 - 如果
areaBelow大于等于totalArea / 2,说明mid过大,应该尝试更小的mid,即 上界up = mid。 - 否则,说明
mid过小,应该尝试更大的mid,即 下界down = mid。
终止条件:up - down <= 1e-5(精度要求)。
4. 计算 mid 以下的面积
对于每个正方形:
- 判断是否完全位于
mid之下:- 如果
y + l <= mid,整个正方形都在mid以下,直接加上l × l的面积。
- 如果
- 部分位于
mid之下:- 计算
height = min(mid - y, l)(mid线以下的部分)。 - 这部分面积为
height × l。
- 计算
3、代码实现
class Solution {
public:double separateSquares(vector<vector<int>>& squares) {// 如果没有正方形, 返回 0.0if (squares.empty()) {return 0.0;}// 初始化上下界double down = static_cast<double>(squares[0][1]); // 最小的 y 值double up = static_cast<double>(squares[0][1] + squares[0][2]); // 最大的 y+l 值double totalArea = 0.0; // 总面积// 计算最小/最大 y 值 和 总面积for (const auto& v : squares) {double y = static_cast<double>(v[1]); // 左下角的 y 坐标double l = static_cast<double>(v[2]); // 正方形边长down = min(down, y); // 更新最小 yup = max(up, y + l); // 更新最大 ytotalArea += l * l; // 计算总面积}// 二分查找while (up - down > 1e-5) {double mid = (up + down) / 2.0; // 计算中点double areaBelow = 0.0; // mid 线以下的面积// 计算当前 mid 线以下的面积for (const auto& v : squares) {double y = static_cast<double>(v[1]); // 左下角 y 坐标double l = static_cast<double>(v[2]); // 正方形边长if (y < mid) { // 仅计算 y < mid 的部分double height = min(mid - y, l); // 计算在 mid 下方的高度areaBelow += height * l; // 计算面积并累加}// 剪枝优化: 如果面积已经大于等于 halfArea, 则提前退出if (areaBelow >= totalArea / 2) {break;}}// 二分查找if (areaBelow >= totalArea / 2) {up = mid; // mid 过大, 缩小上界} else {down = mid; // mid 过小, 扩大下界}}return up; // 返回最终答案}
};
class Solution {
public:double separateSquares(vector<vector<int>>& squares) {double totalArea = 0.0;int maxY = 0;// 计算总面积, 并确定最大 y 坐标for (const auto& square : squares) {int x = square[0], y = square[1], side = square[2];totalArea += static_cast<double>(side) * side;maxY = max(maxY, y + side);}// 判断是否满足条件auto isValidY = [&](double yLine) -> bool {double areaBelow = 0.0;for (const auto& square : squares) {int y = square[1], side = square[2];if (y < yLine) {double effectiveHeight = min(yLine - y, static_cast<double>(side));areaBelow += effectiveHeight * side;}}return areaBelow >= totalArea / 2;};// 二分查找满足条件的最小 ydouble left = 0.0, right = static_cast<double>(maxY);while (right - left > 1e-5) {double mid = (left + right) / 2.0;if (isValidY(mid)) {right = mid;} else {left = mid;}}return right;}
};

4、复杂度分析
时间复杂度: O(n logM)
n是正方形的个数。M是y的搜索范围(最大y减去最小y)。- 二分查找大约进行
logM轮,每轮O(n)遍历正方形,最终 复杂度是 O(n logM)。
空间复杂度: O(1)
- 只使用了常数级变量,不需要额外的存储。
Q3、分割正方形 Ⅱ
1、题目描述
给你一个二维整数数组 squares ,其中 squares[i] = [xi, yi, li] 表示一个与 x 轴平行的正方形的左下角坐标和正方形的边长。
找到一个最小的 y 坐标,它对应一条水平线,该线需要满足它以上正方形的总面积 等于 该线以下正方形的总面积。
答案如果与实际答案的误差在 10-5 以内,将视为正确答案。
注意:正方形 可能会 重叠。重叠区域只 统计一次 。
2、解题思路
-
问题分析:
-
我们需要找到一个最小的
y值(即水平线的 y 坐标),使得该线以上的总面积和以下的总面积相等。 -
由于正方形的重叠会导致面积的重复计算,因此我们需要跟踪每个 x 区间内的覆盖长度,计算这些区间的总面积。
-
-
区间求解:
-
我们可以利用线段树来处理区间的覆盖情况。线段树可以在区间更新时有效计算每个区间的覆盖长度。
-
坐标压缩:由于正方形的 x 坐标值范围可能非常大,直接使用这些值作为线段树的索引不切实际。因此我们将 x 坐标压缩到一个较小的范围。
-
-
步骤:
-
首先,对于每个正方形,提取其上边界和下边界,记录它们在 x 轴上的位置。
-
接着,我们对所有的事件进行排序。每个事件代表一个正方形的开始(下边界)或结束(上边界)。
-
使用线段树来更新每个正方形的覆盖状态,并计算每一条水平线(y 坐标)下面的总面积。然后通过累积的面积差来找到使总面积平衡的水平线。
-
3、代码实现
// 定义线段树节点的结构
struct Node {int minCover; // 当前节点的最小覆盖数, 表示该区间内有多少个正方形覆盖int coveredLen; // 满足 minCover == 0 的线段长度, 表示该区间的实际被覆盖长度int lazy; // 懒标记, 用于延迟更新// 应用懒标记: 通过增加覆盖数来表示区间内正方形的覆盖情况void apply(int value) {minCover += value;lazy += value; // 增加懒标记, 表示区间内的所有覆盖操作}
};class SegmentTree {
private:vector<Node> tree; // 存储线段树的节点vector<int> compressedX; // 坐标压缩后的 x 值int size; // 线段树的大小// 合并两个子节点的结果, 返回合并后的节点Node merge(const Node& left, const Node& right) {// 合并后最小覆盖数为左右子节点中的最小覆盖数int minCover = min(left.minCover, right.minCover);// 如果左右子节点的最小覆盖数为 0, 则累加它们的覆盖长度int coveredLen = (left.minCover == minCover ? left.coveredLen : 0) + (right.minCover == minCover ? right.coveredLen : 0);// 返回合并后的节点return {minCover, coveredLen, 0};}// 构建线段树的递归方法void build(int node, int left, int right) {if (left == right) {// 如果当前区间是一个点, 则初始化该节点tree[node] = {0, compressedX[right] - compressedX[right - 1], 0};} else {// 否则递归构建左右子树int mid = (left + right) / 2;build(node * 2, left, mid);build(node * 2 + 1, mid + 1, right);// 合并左右子树tree[node] = merge(tree[node * 2], tree[node * 2 + 1]);}}// 懒标记下推操作, 更新子节点的懒标记void pushDown(int node) {if (tree[node].lazy == 0) {return; // 如果当前节点没有懒标记, 则不需要下推}// 将懒标记下推到左右子节点tree[node * 2].apply(tree[node].lazy);tree[node * 2 + 1].apply(tree[node].lazy);tree[node].lazy = 0; // 清空当前节点的懒标记}// 区间更新操作: 更新区间 [ql, qr] 的覆盖数void modify(int node, int left, int right, int ql, int qr, int value) {// 如果当前区间完全在查询区间内, 则直接更新当前节点if (ql <= left && right <= qr) {tree[node].apply(value);return;}// 如果当前区间与查询区间有交集, 则需要下推懒标记并递归更新左右子树pushDown(node);int mid = (left + right) / 2;if (ql <= mid) {modify(node * 2, left, mid, ql, qr, value);}if (qr > mid) {modify(node * 2 + 1, mid + 1, right, ql, qr, value);}// 合并左右子树的结果tree[node] = merge(tree[node * 2], tree[node * 2 + 1]);}public:// 构造函数, 接受压缩后的 x 坐标数组SegmentTree(const vector<int>& uniqueX) {size = uniqueX.size();compressedX = uniqueX;tree.resize(size * 4); // 为线段树分配空间build(1, 1, size - 1); // 初始化线段树}// 更新区间 [leftIndex, rightIndex] 的覆盖数void update(int leftIndex, int rightIndex, int value) {modify(1, 1, size - 1, leftIndex, rightIndex, value);}// 获取线段树中当前覆盖数为 0 的区间的总长度int getCoveredLength() {// 如果最小覆盖数为 0, 说明该区间没有被任何正方形覆盖return tree[1].minCover == 0 ? (compressedX.back() - compressedX.front()) - tree[1].coveredLen // 返回该区间未被覆盖的部分长度: compressedX.back() - compressedX.front(); // 否则返回整个区间长度}
};// 主要的解题函数
class Solution {
public:double separateSquares(vector<vector<int>>& squares) {// 使用 map 进行坐标压缩: 记录所有正方形的左下角和右上角的 x 坐标map<int, int> coordMap;for (const auto& sq : squares) {coordMap[sq[0]] = 1; // 将正方形的左边 x 坐标添加到坐标映射中coordMap[sq[0] + sq[2]] = 1; // 将正方形的右边 x 坐标添加到坐标映射中}// 为每个唯一的 x 坐标分配一个压缩后的索引int index = 0;for (auto& kv : coordMap) {kv.second = index++;}// 将压缩后的 x 坐标存入数组vector<int> compressedX(index);for (auto& p : coordMap) {compressedX[p.second] = p.first;}// 生成事件列表: 记录正方形的上边界和下边界vector<array<int, 4>> events;for (const auto& sq : squares) {// 正方形的下边界事件events.push_back({sq[1], coordMap[sq[0]] + 1, coordMap[sq[0] + sq[2]], 1});// 正方形的上边界事件events.push_back({sq[1] + sq[2], coordMap[sq[0]] + 1, coordMap[sq[0] + sq[2]], -1}); }// 按 y 坐标 (即正方形的上下边界) 排序事件sort(events.begin(), events.end());// 使用线段树计算总面积SegmentTree segTree(compressedX);long long totalArea = 0;for (size_t i = 0; i + 1 < events.size(); i++) {// 更新线段树的覆盖状态segTree.update(events[i][1], events[i][2], events[i][3]);// 获取当前覆盖长度int coveredLength = segTree.getCoveredLength();// 累加总面积totalArea += 1LL * coveredLength * (events[i + 1][0] - events[i][0]);}// 计算中位水平线的面积long long accumulatedArea = 0;segTree = SegmentTree(compressedX); // 重新初始化线段树for (size_t i = 0; i + 1 < events.size(); i++) {// 更新线段树segTree.update(events[i][1], events[i][2], events[i][3]);// 获取当前覆盖长度int coveredLength = segTree.getCoveredLength();// 累加面积accumulatedArea += 1LL * coveredLength * (events[i + 1][0] - events[i][0]);// 计算此时累计的面积和剩余面积的差值long long areaDiff = accumulatedArea - (totalArea - accumulatedArea);// 如果累计面积大于或等于剩余面积, 则找到平衡线if (areaDiff >= 0) {return events[i + 1][0] - 0.5 * areaDiff / coveredLength;}};return -1; // 如果找不到合适的平衡线, 返回 -1}
};

4、复杂度分析
时间复杂度:
- 坐标压缩和事件排序:
O(n log n),其中n是正方形的个数。 - 线段树的构建和查询:
O(n log n)。 - 总体时间复杂度
Q4、最短匹配字符串
1、题目描述
给你一个字符串 s 和一个模式字符串 p,其中 p 恰好 包含 两个 '*' 字符。
p 中的 '*' 匹配零个或多个字符的任何序列。
返回 s 中与 p 匹配的 最短 子字符串的长度。如果没有这样的子字符串,返回 -1。
子字符串 是字符串中的一个连续字符序列(空子字符串也被认为是合法字符串)。
2、解题思路
此问题的核心是利用字符串匹配的技巧来拆解模式字符串并在 s 中寻找匹配。由于 '*' 可以匹配任意字符序列,因此我们将模式字符串拆解为三个部分:
*前的前缀部分;- 两个
*之间的部分; *后的后缀部分。
我们可以分别在 s 中查找这些部分的匹配,然后合并它们来获得最短匹配的子字符串。
具体步骤如下:
- 拆解模式字符串:将模式字符串
p拆分为三个部分:- 前缀部分:位于第一个
*前; - 中间部分:位于两个
*之间; - 后缀部分:位于第二个
*后。
- 前缀部分:位于第一个
- 字符串匹配:分别在
s中查找这三部分的匹配位置。- 对于前缀和后缀部分,我们可以使用字符串匹配算法来查找其在
s中的所有匹配位置。 - 对于中间部分,我们可以从
s中查找所有匹配位置,并确保它与前缀和后缀部分的匹配不重叠。
- 对于前缀和后缀部分,我们可以使用字符串匹配算法来查找其在
- 计算最短子字符串:通过遍历所有匹配的中间部分,尝试找到最短的匹配子字符串。
3、代码实现
class Solution {
private:// 计算模式串 pattern 的前缀函数 (pi 数组)vector<int> computePrefixFunction(const string& pattern) {int n = pattern.size();vector<int> pi(n, 0); // pi 数组记录每个位置的最长相等前后缀长度int match = 0;// 遍历模式串的字符, 通过前缀函数更新匹配位置for (int i = 1; i < n; ++i) {while (match > 0 && pattern[match] != pattern[i]) {match = pi[match - 1]; // 跳过不匹配部分}if (pattern[match] == pattern[i]) {match++;}pi[i] = match; // 更新前缀函数}return pi;}// 在文本串 text 中查找模式串 pattern 的所有匹配位置vector<int> findPatternMatches(const string& text, const string& pattern) {int n = text.size();int m = pattern.size();if (m == 0) {// 如果模式串为空, pattern 的所有位置都能匹配空串vector<int> pos(n + 1);iota(pos.begin(), pos.end(), 0); // 生成从 0 到 n 的位置return pos;}vector<int> pi = computePrefixFunction(pattern); // 取前缀函数vector<int> matches; // 用于存储匹配的位置int match = 0;for (int i = 0; i < n; ++i) {while (match > 0 && pattern[match] != text[i]) {match = pi[match - 1]; // 找到最长的匹配前缀}if (pattern[match] == text[i]) {match++;}if (match == m) {matches.push_back(i - m + 1); // 匹配成功, 记录匹配的起始位置match = pi[match - 1]; // 使用前缀函数回溯, 继续查找下一个匹配}}return matches;}public:// 计算最短的匹配子字符串int shortestMatchingSubstring(const string& s, const string& p) {// 找到两个 '*' 的位置int firstStar = p.find('*');int lastStar = p.rfind('*');// 获取前三段字符串 (即 '*' 之前、之间和之后的部分)string prefix = p.substr(0, firstStar); // 第一个 '*' 前的部分string middle = p.substr(firstStar + 1, lastStar - firstStar - 1); // 两个 '*' 之间的部分string suffix = p.substr(lastStar + 1); // 第二个 '*' 后的部分// 分别查找每部分在 s 中的匹配位置vector<int> prefixMatches = findPatternMatches(s, prefix);vector<int> middleMatches = findPatternMatches(s, middle);vector<int> suffixMatches = findPatternMatches(s, suffix);// 计算每段的长度int lenPrefix = prefix.size();int lenMiddle = middle.size();int lenSuffix = suffix.size();// 用于记录最短匹配子字符串的长度int minLength = INT_MAX;int prefixIdx = 0, suffixIdx = 0;// 遍历所有的 middle 匹配, 寻找左右两边最近的匹配, 确保没有重叠for (int middlePos : middleMatches) {// 处理右边, 找到离 middlePos 最近且不重叠的 suffix 匹配while (suffixIdx < suffixMatches.size() && suffixMatches[suffixIdx] < middlePos + lenMiddle) {suffixIdx++;}if (suffixIdx == suffixMatches.size()) {break;}// 处理左边, 找到离 middlePos 最近且不重叠的 prefix 匹配while (prefixIdx < prefixMatches.size() && prefixMatches[prefixIdx] <= middlePos - lenPrefix) {prefixIdx++;}if (prefixIdx > 0) {// 计算最短子字符串的长度int currentLength = suffixMatches[suffixIdx] + lenSuffix - prefixMatches[prefixIdx - 1];minLength = min(minLength, currentLength); // 更新最短长度}}return minLength == INT_MAX ? -1 : minLength; // 如果找不到匹配, 返回 -1}
};

4、复杂度分析
- 计算前缀函数的时间复杂度为 O(m),其中 m 为模式串的长度。
- 在文本
s中查找每个部分的匹配位置的时间复杂度为 O(n),其中 n 为文本串的长度。 - 最终合并各部分匹配位置并找到最短匹配的时间复杂度为 O(n)。
因此,整体时间复杂度为 O(n + m),其中 n 为文本串长度,m 为模式串长度。
相关文章:
第150场双周赛:好数字之和、分割正方形 Ⅰ、分割正方形 Ⅱ、最短匹配字符串
Q1、好数字之和 1、题目描述 给定一个整数数组 nums 和一个整数 k,如果元素 nums[i] 严格 大于下标 i - k 和 i k 处的元素(如果这些元素存在),则该元素 nums[i] 被认为是 好 的。如果这两个下标都不存在,那么 nums…...
HDFS是如何存储和管理大数据
HDFS(Hadoop Distributed File System,Hadoop分布式文件系统)是专为大数据处理而设计的分布式文件系统,具有高吞吐量、高容错性等特点,适用于大规模数据存储和管理。以下是HDFS存储和管理大数据的详细机制:…...
进阶——第十六届蓝桥杯嵌入式熟练度练习(开发板捕获频率和占空比)
单通道捕获频率 HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1); void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {if(htim->InstanceTIM2) {cap1HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);TIM2-&…...
智能协同:数据集成平台与DeepSeek驱动的数据分析与智能调度革新
前言 企业面临着海量数据的挑战与机遇。如何高效地整合多源数据、精准分析并智能决策,成为企业提升竞争力的关键。本文解析轻易云数据集成平台与DeepSeek技术结合在数据分析和智能调度方面的创新应用,揭示其为企业带来的高效、智能与精准的业务价值。 …...
Mybatis高级(动态SQL)
目录 一、动态SQL 1.1 数据准备: 1.2 <if>标签 1.3<trim> 标签 1.4<where>标签 1.5<set>标签 1.6 <foreach>标签 1.7<include> 标签 一、动态SQL 动态SQL是Mybatis的强⼤特性之⼀,能够完成不同条件下不同…...
申论对策建议类【2022江苏B卷第一题“如何开展网络直播”】
材料: 近年来,公安交管部门通过网络直播,将执法过程和执法细节以视频形式呈现在公众面前,吸引“围观”、组织点评,让执法过程变成一堂生动的法治公开课。 “各位网友,大家好!这里是‘全国交通…...
蓝耘智算携手DeepSeek,共创AI未来
🌟 各位看官号,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习如何通过蓝耘智算使用DeepSeek R1模型 👍 如果觉得这篇文章有帮助,欢迎您一键三连&a…...
FFmpeg源码:url_find_protocol函数分析
一、url_find_protocol函数的定义 url_find_protocol函数定义在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的源文件libavformat/avio.c中: static const struct URLProtocol *url_find_protocol(const char *filename) {const URLProt…...
3D与2D机器视觉机械臂引导的区别
3D与2D机器视觉在机械臂引导中的主要区别如下: 数据维度 2D视觉:仅处理平面图像,提供X、Y坐标信息,无法获取深度(Z轴)数据。 3D视觉:处理三维空间数据,提供X、Y、Z坐标及物体的姿态…...
C# 添加图标
一、前言 为应用程序添加图标是优化用户界面、提升应用辨识度的重要操作。合适的图标能帮助用户快速识别和区分不同应用,增强应用的易用性和专业性。 本指南旨在为你提供详细、易懂的步骤,教你如何为应用程序的窗体添加图标。从图标素材的获取到具体的…...
基于 Python 和 Django 的北极星招聘数据可视化系统(附源码,部署)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
基于STM32、HAL库、MB85RC16PNF(I2C接口)驱动程序设计
一、概述: MB85RC16PNF 是富士通推出的16Kbit(2K x 8位)FRAM(铁电随机存取存储器),具有非易失性、高读写速度和低功耗特性,常用于数据存储。 二、硬件连接: MB85RC16PNF通过I2C接口与STM32L4XX通信,典型连接如下: VDD:3.3V VSS:GND SDA:I2C数据线 SCL:I2C时钟线…...
【产品推介】可驱动5A负载的降压型DC/DC转换器XBL1663
一、产品简介 采用ESOP-8封装的XBL1663最大可输出5A电流 芯伯乐XBL1663是一款专为降压型DC/DC转换器设计的单片集成电路,具有高转换效率、恒定开关频率工作的特点。内置功率 MOSFET可在 4.5 V-40V 输入电源上实现 5A 峰值输出电流,并具有出色的负载和线…...
20.【线性代数】——坐标系中,平行四边形面积=矩阵的行列式
三 坐标系中,平行四边形面积矩阵的行列式 定理验证 定理 在坐标系中,由向量(a,b)和向量(c,d)组成平行四边形的面积 矩阵 [ a b c d ] \begin{bmatrix} a&b\\ c&d \end{bmatrix} [acbd]的行列式,即&#x…...
数据库知识速记:事物隔离级别
数据库知识速记:事物隔离级别 一、什么是事物隔离级别? 事物隔离级别(Transaction Isolation Levels)指的是在数据库管理系统中,不同事物之间在访问共享数据时的隔离程度。隔离级别不仅影响数据的读取和写入行为&…...
重构测试项目为spring+springMVC+Mybatis框架
重构测试项目为springspringMVCMybatis框架 背景 继上次将自动化测试时的医药管理信息系统项目用idea运行成功后,由于项目结构有些乱,一部分代码好像也重复,于是打算重新重构以下该项目,这次先使用springspringMVCMybatis框架 …...
如何使用OPENAI的Whisper功能进行音频字母提取功能
首先你可以使用 Python 中的 requests 库来下载该音频文件,然后通过 open() 打开该文件并传递给 OpenAI Whisper API。 完整代码如下: 安装需要的库: pip install openai requests Python 代码: OPENAI_API_KEY "your o…...
DFS算法篇:理解递归,熟悉递归,成为递归
1.DFS原理 那么dfs就是大家熟知的一个深度优先搜索,那么听起来很高大尚的一个名字,但是实际上dfs的本质就是一个递归,而且是一个带路径的递归,那么递归大家一定很熟悉了,大学c语言课程里面就介绍过递归,我…...
2025java常见面试题第一弹
1. Java中的HashMap和Hashtable有什么区别? 答案: 线程安全性: HashMap是线程不安全的,适合单线程环境。如果在多线程环境下使用,可能会出现数据不一致的问题。 Hashtable是线程安全的,内部方法通过synch…...
JMeter工具介绍、元件和组件的介绍
Jmeter功能概要 JDK常用文件目录介绍 Bin目录:存放可执行文件和配置文件 Docs目录:是Jmeter的API文档,用于开发扩展组件 printable_docs目录:用户帮助手册 lib目录:存放JMeter依赖的jar包和用户扩展所依赖的Jar包…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
