哈希表(典型算法思想)—— OJ例题算法解析思路
目录
一、1. 两数之和 - 力扣(LeetCode)
算法代码:
1. 问题描述
2. 核心思路
3. 代码实现思路
(1)初始化哈希表
(2)遍历数组
(3)返回结果
4. 时间复杂度分析
5. 示例演示
输入:
执行过程:
输出:
6. 边界情况考虑
7. 代码总结
8. 代码优化(可选)
二、面试题 01.02. 判定是否互为字符重排 - 力扣(LeetCode)
算法代码:
1. 问题描述
2. 核心思路
3. 代码实现思路
(1)长度检查
(2)初始化哈希表
(3)统计 s1 的字符频率
(4)检查 s2 的字符频率
(5)返回结果
4. 时间复杂度分析
5. 示例演示
输入:
执行过程:
输出:
6. 边界情况考虑
7. 代码总结
8. 代码优化(可选)
三、217. 存在重复元素 - 力扣(LeetCode)
算法代码:
代码分析
1. 输入和输出
2. 哈希表的使用
3. 遍历数组
4. 检查重复
5. 返回结果
整体思路总结
时间与空间复杂度
举例说明
四、219. 存在重复元素 II - 力扣(LeetCode)
算法代码:
代码分析
1. 输入和输出
2. 哈希表的使用
3. 遍历数组
4. 检查重复和索引差
5. 更新哈希表
6. 返回结果
整体思路总结
时间与空间复杂度
举例说明
五、 49. 字母异位词分组 - 力扣(LeetCode)
算法代码:
代码分析
1. 输入和输出
2. 哈希表的使用
3. 将字母异位词分组
4. 提取结果
5. 返回结果
整体思路总结
时间与空间复杂度
举例说明
一、1. 两数之和 - 力扣(LeetCode)
算法代码:
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hash; // <nums[i], i>for (int i = 0; i < nums.size(); i++) {int x = target - nums[i];if (hash.count(x))return {hash[x], i};hash[nums[i]] = i;}// 照顾编译器return {-1, -1};}
};
1. 问题描述
给定一个整数数组 nums
和一个目标值 target
,要求在数组中找到两个数,使得它们的和等于 target
,并返回这两个数的下标。
2. 核心思路
-
暴力解法:双重循环遍历所有可能的数对,检查它们的和是否等于
target
。时间复杂度为 O(n2)O(n2)。 -
优化思路:利用哈希表存储已经遍历过的数及其下标,通过查找哈希表来快速判断是否存在满足条件的数对。
3. 代码实现思路
(1)初始化哈希表
unordered_map<int, int> hash; // <nums[i], i>
-
哈希表的键是数组中的元素值(
nums[i]
),值是该元素的下标(i
)。 -
哈希表的作用是快速查找某个值是否已经存在于数组中。
(2)遍历数组
for (int i = 0; i < nums.size(); i++) {int x = target - nums[i];if (hash.count(x))return {hash[x], i};hash[nums[i]] = i;
}
-
步骤 1:计算目标差值
x = target - nums[i]
。-
如果
x
存在于哈希表中,说明之前已经遍历过x
,且x
的下标为hash[x]
。 -
此时,
nums[i]
和x
就是满足条件的两个数,直接返回它们的下标{hash[x], i}
。
-
-
步骤 2:如果
x
不存在于哈希表中,将当前元素nums[i]
及其下标i
存入哈希表,以便后续查找。
(3)返回结果
-
如果找到满足条件的数对,直接返回它们的下标。
-
如果遍历结束后仍未找到,返回
{-1, -1}
(这是一个默认值,用于照顾编译器,实际题目保证有解)。
4. 时间复杂度分析
-
时间复杂度:O(n)。
-
遍历数组一次,每次查找哈希表的时间复杂度为 O(1)。
-
-
空间复杂度:O(n)。
-
哈希表最多存储
n
个元素。
-
5. 示例演示
输入:
nums = [2, 7, 11, 15], target = 9
执行过程:
-
初始化哈希表:
hash = {}
。 -
遍历数组:
-
i = 0
,nums[0] = 2
,计算x = 9 - 2 = 7
。-
哈希表中没有
7
,将2
存入哈希表:hash = {2: 0}
。
-
-
i = 1
,nums[1] = 7
,计算x = 9 - 7 = 2
。-
哈希表中有
2
,返回{hash[2], 1} = {0, 1}
。
-
-
输出:
[0, 1]
6. 边界情况考虑
-
重复元素:如果数组中有重复元素,哈希表会存储最后一个出现的下标,但不会影响结果,因为题目保证只有一个解。
-
无解情况:题目保证有解,因此无需处理无解情况。如果题目不保证有解,可以在遍历结束后返回空数组或抛出异常。
7. 代码总结
-
核心思想:利用哈希表的快速查找特性,将两数之和问题从 O(n2)O(n2) 优化到 O(n)O(n)。
-
实现细节:
-
哈希表存储元素值及其下标。
-
遍历时计算目标差值,并在哈希表中查找。
-
找到解后立即返回,避免不必要的遍历。
-
8. 代码优化(可选)
-
如果题目要求返回所有可能的解,可以将哈希表的值改为存储下标列表,并在找到解时记录所有满足条件的下标对。
-
如果数组已排序,可以使用双指针法,进一步优化空间复杂度为 O(1)O(1)。
二、面试题 01.02. 判定是否互为字符重排 - 力扣(LeetCode)
算法代码:
class Solution {
public:bool CheckPermutation(string s1, string s2) {if (s1.size() != s2.size())return false;int hash[26] = {0};// 先统计第⼀个字符串的信息for (auto ch : s1)hash[ch - 'a']++;// 扫描第⼆个字符串,看看是否能重排for (auto ch : s2) {hash[ch - 'a']--;if (hash[ch - 'a'] < 0)return false;}return true;}
};
1. 问题描述
给定两个字符串 s1
和 s2
,判断它们是否可以通过字符重排得到彼此。例如:
-
s1 = "abc"
,s2 = "cba"
,返回true
。 -
s1 = "abc"
,s2 = "def"
,返回false
。
2. 核心思路
-
变位词的定义:两个字符串的字符种类和数量完全相同,但顺序可以不同。
-
统计字符频率:通过哈希表(数组)统计每个字符的出现次数,然后比较两个字符串的字符频率是否一致。
3. 代码实现思路
(1)长度检查
if (s1.size() != s2.size())return false;
-
如果两个字符串的长度不同,直接返回
false
,因为长度不同的字符串不可能是变位词。
(2)初始化哈希表
int hash[26] = {0};
-
使用一个长度为 26 的数组
hash
来统计字符频率。 -
数组的索引表示字符(
'a'
到'z'
),值表示该字符的出现次数。
(3)统计 s1
的字符频率
for (auto ch : s1)hash[ch - 'a']++;
-
遍历
s1
的每个字符,将其映射到数组索引(ch - 'a'
),并增加对应位置的计数。
(4)检查 s2
的字符频率
for (auto ch : s2) {hash[ch - 'a']--;if (hash[ch - 'a'] < 0)return false;
}
-
遍历
s2
的每个字符,将其映射到数组索引,并减少对应位置的计数。 -
如果某个字符的计数变为负数,说明
s2
中该字符的出现次数多于s1
,直接返回false
。
(5)返回结果
return true;
-
如果遍历结束后没有发现计数为负数的情况,说明两个字符串的字符频率完全一致,返回
true
。
4. 时间复杂度分析
-
时间复杂度:O(n),其中 nn 是字符串的长度。
-
遍历
s1
和s2
各一次,每次操作的时间复杂度为 O(1)O(1)。
-
-
空间复杂度:O(1)。
-
使用固定大小的数组(长度为 26),与输入规模无关。
-
5. 示例演示
输入:
s1 = "anagram", s2 = "nagaram"
执行过程:
-
长度检查:
s1
和s2
的长度均为 7,继续执行。 -
统计
s1
的字符频率:-
hash = {a: 3, n: 1, g: 1, r: 1, m: 1}
。
-
-
检查
s2
的字符频率:-
遍历
s2
,每次减少对应字符的计数。 -
遍历结束后,
hash
中所有字符的计数均为 0。
-
-
返回
true
。
输出:
true
6. 边界情况考虑
-
空字符串:如果
s1
和s2
都为空字符串,返回true
。 -
大小写敏感:代码假设字符串只包含小写字母。如果包含大写字母或其他字符,需要扩展哈希表的大小或使用
unordered_map
。 -
非字母字符:如果字符串包含非字母字符(如数字、标点符号),需要调整哈希表的实现方式。
7. 代码总结
-
核心思想:通过哈希表统计字符频率,判断两个字符串的字符频率是否一致。
-
实现细节:
-
使用数组模拟哈希表,适用于字符范围固定的场景。
-
遍历时动态减少字符计数,避免额外的遍历操作。
-
8. 代码优化(可选)
-
如果字符串可能包含大写字母或其他字符,可以使用
unordered_map
代替数组:unordered_map<char, int> hash; for (auto ch : s1)hash[ch]++; for (auto ch : s2) {hash[ch]--;if (hash[ch] < 0)return false; } return true;
-
如果字符串长度较大,可以提前返回
false
,避免不必要的遍历。
三、217. 存在重复元素 - 力扣(LeetCode)
算法代码:
class Solution {
public:bool containsDuplicate(vector<int>& nums) {unordered_set<int> hash;for (auto x : nums)if (hash.count(x))return true;elsehash.insert(x);return false;}
};
代码分析
1. 输入和输出
-
输入: 一个整数数组
nums
。 -
输出: 布尔值
true
或false
,分别表示数组中是否存在重复元素。
2. 哈希表的使用
unordered_set<int> hash;
-
创建一个
unordered_set<int>
类型的哈希表hash
,用于存储已经遍历过的元素。哈希表的查找和插入操作平均时间复杂度为 O(1),使得这个方法高效。
3. 遍历数组
for (auto x : nums)
-
使用范围 for 循环遍历数组
nums
中的每个元素x
。
4. 检查重复
if (hash.count(x))return true; // 如果已存在,则返回 true
elsehash.insert(x); // 否则,将当前元素插入哈希表
-
在每次遍历时,使用
hash.count(x)
检查当前元素x
是否已存在于哈希表中:-
如果存在,说明有重复元素,直接返回
true
。 -
如果不存在,将当前元素
x
插入哈希表中,以便在后续的遍历中进行检查。
-
5. 返回结果
return false;
-
如果循环结束后仍未发现重复元素,则返回
false
。
整体思路总结
-
初始化: 创建一个空的哈希表,用于存储已经检查过的元素。
-
遍历元素: 逐一检查数组中的元素。
-
检查存在性: 对每个元素,使用哈希表判断它是否已经出现过。
-
处理结果:
-
如果出现过,返回
true
。 -
如果遍历结束后未发现重复,返回
false
。
-
时间与空间复杂度
-
时间复杂度: O(n),其中 n 是数组
nums
的长度。遍历数组的每个元素,每次查找和插入操作的平均时间复杂度为 O(1)。 -
空间复杂度: O(n),在最坏的情况下,哈希表可能会存储数组中的所有元素。
举例说明
假设输入数组为 nums = [1, 2, 3, 1]
。
-
初始化哈希表
hash
为{}
。 -
遍历第一个元素
1
,hash.count(1)
返回 0,插入1
,现在hash = {1}
。 -
遍历第二个元素
2
,hash.count(2)
返回 0,插入2
,现在hash = {1, 2}
。 -
遍历第三个元素
3
,hash.count(3)
返回 0,插入3
,现在hash = {1, 2, 3}
。 -
遍历第四个元素
1
,hash.count(1)
返回 1,发现重复,返回true
。
如果输入为 nums = [1, 2, 3]
,遍历结束后没有发现重复,返回 false
。
四、219. 存在重复元素 II - 力扣(LeetCode)
算法代码:
class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_map<int, int> hash;for (int i = 0; i < nums.size(); i++) {if (hash.count(nums[i])) {if (i - hash[nums[i]] <= k)return true;}hash[nums[i]] = i;}return false;}
};
代码分析
1. 输入和输出
-
输入: 一个整数数组
nums
和一个整数 ( k )。 -
输出: 布尔值
true
或false
,分别表示是否存在满足条件的重复元素。
2. 哈希表的使用
unordered_map<int, int> hash;
-
创建一个
unordered_map<int, int>
类型的哈希表hash
,用于存储每个元素及其最近出现的索引。键为数组中的元素,值为该元素最后一次出现的索引。
3. 遍历数组
for (int i = 0; i < nums.size(); i++) {
-
使用一个 for 循环遍历数组
nums
中的每个元素。
4. 检查重复和索引差
if (hash.count(nums[i])) {if (i - hash[nums[i]] <= k)return true; // 找到满足条件的重复元素
}
-
在每次遍历时,检查当前元素
nums[i]
是否已经存在于哈希表中:-
如果存在,检查当前索引 ( i ) 与该元素最近索引(即
hash[nums[i]]
)之间的差值是否小于或等于 ( k )。 -
如果满足条件 ( i - hash[nums[i]] \leq k ),则返回
true
,表示找到了满足条件的重复元素。
-
5. 更新哈希表
hash[nums[i]] = i;
-
无论该元素是否存在于哈希表中,都将当前元素
nums[i]
的索引 ( i ) 更新到哈希表中。这确保了每次我们都能得到当前元素的最新索引。
6. 返回结果
return false;
-
如果循环结束后仍未找到满足条件的重复元素,返回
false
。
整体思路总结
-
初始化: 创建一个哈希表
hash
来存储元素及其索引。 -
遍历元素: 逐一遍历数组中的每个元素。
-
检查存在性与条件:
-
对于每个元素,检查其是否已经在哈希表中。
-
如果在,计算该元素的当前索引与上次出现索引之间的差值是否小于或等于 ( k )。
-
满足条件则返回
true
。
-
-
更新索引: 更新哈希表中该元素的最新索引。
-
返回结果: 如果遍历结束未发现符合条件的重复元素,则返回
false
。
时间与空间复杂度
-
时间复杂度: O(n),其中 ( n ) 是数组
nums
的长度。对每个元素进行常数时间的查找和插入操作。 -
空间复杂度: O(min(n, k)),在最坏情况下,哈希表可能会存储最多 ( k ) 个不同的元素(如果数组中重复的元素分布在 ( k ) 个索引范围内),或者存储 ( n ) 个元素(如果所有元素都是不同的)。
举例说明
假设我们有一个数组 nums
为 [1, 2, 3, 1]
,并且 ( k = 3 )。
-
初始哈希表:
hash
为{}
。 -
遍历:
-
索引 0: 元素
1
,hash
变为{1: 0}
。 -
索引 1: 元素
2
,hash
变为{1: 0, 2: 1}
。 -
索引 2: 元素
3
,hash
变为{1: 0, 2: 1, 3: 2}
。 -
索引 3: 元素
1
,hash
中已存在1
,计算索引差:3 - 0 = 3
,满足条件 ( |i - j| \leq k ),返回true
。
-
如果我们检查数组 nums = [1, 0, 1, 1]
,并且 ( k = 1 ):
-
初始化:
hash
为{}
。 -
遍历:
-
索引 0:
1
,hash
变为{1: 0}
。 -
索引 1:
0
,hash
变为{1: 0, 0: 1}
。 -
索引 2:
1
,hash
中已存在1
,计算差值:2 - 0 = 2
,不满足 ( |i - j| \leq 1 )。 -
索引 3:
1
,再次找到1
,计算差值:3 - 0 = 3
,仍然不满足条件,最终返回false
。
-
五、 49. 字母异位词分组 - 力扣(LeetCode)
算法代码:
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string, vector<string>> hash;// 1. 把所有的字⺟异位词分组for (auto& s : strs) {string tmp = s;sort(tmp.begin(), tmp.end());hash[tmp].push_back(s);}// 2. 结果提取出来vector<vector<string>> ret;for (auto& [x, y] : hash) {ret.push_back(y);}return ret;}
};
代码分析
1. 输入和输出
-
输入: 一个字符串数组
strs
,其中包含多个字符串。 -
输出: 一个二维字符串数组
ret
,其中每个子数组包含一组字母异位词。
2. 哈希表的使用
unordered_map<string, vector<string>> hash;
-
创建一个哈希表
hash
,键为排序后的字符串,值为一个字符串向量,存储与该排序字符串相对应的原字符串列表。
3. 将字母异位词分组
for (auto& s : strs) {string tmp = s;sort(tmp.begin(), tmp.end());hash[tmp].push_back(s);
}
-
遍历输入的字符串数组
strs
:-
对于每个字符串
s
,创建一个临时字符串tmp
并对其进行排序。排序后的字符串作为键,所有与该键对应的异位词存储在哈希表中。 -
使用
hash[tmp].push_back(s)
将原字符串s
加入哈希表中对应的向量。
-
4. 提取结果
vector<vector<string>> ret;
for (auto& [x, y] : hash) {ret.push_back(y);
}
-
创建一个二维向量
ret
用于存储最终的结果。 -
遍历哈希表,提取每个键
x
及其对应的值y
(即异位词组),并将每个值添加到结果向量ret
中。
5. 返回结果
return ret;
-
返回包含所有字母异位词组的二维向量
ret
。
整体思路总结
-
初始化: 创建一个哈希表
hash
用于存储经过排序的字符串及其对应的原字符串,它将用于分组异位词。 -
遍历输入字符串: 对于每个字符串,将其字母排序,使用排序后的字符串作为键,将原字符串存储到对应的值(向量)中。
-
提取结果: 从哈希表中提取所有的异位词组并存储到结果向量中。
-
返回结果: 返回分组后的异位词。
时间与空间复杂度
-
时间复杂度: O(N * K log K),其中 ( N ) 是字符串数组的长度,( K ) 是字符串的平均长度。对于每个字符串,排序的时间复杂度是 O(K log K),因此整体复杂度为 O(N * K log K)。
-
空间复杂度: O(N * K),存储所有输入字符串的哈希表和结果向量占用的空间,最坏情况下需要存储所有字符串。
举例说明
假设输入字符串数组为 strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
。
-
初始化哈希表:
hash
为{}
。 -
遍历并分组:
-
对于字符串
"eat"
,排序后为"aet"
,哈希表更新为{ "aet": ["eat"] }
。 -
"tea"
排序后仍为"aet"
,哈希表更新为{ "aet": ["eat", "tea"] }
。 -
"tan"
排序后为"ant"
,哈希表更新为{ "aet": ["eat", "tea"], "ant": ["tan"] }
。 -
"ate"
排序后为"aet"
,哈希表更新为{ "aet": ["eat", "tea", "ate"], "ant": ["tan"] }
。 -
"nat"
排序后为"ant"
,哈希表更新为{ "aet": ["eat", "tea", "ate"], "ant": ["tan", "nat"] }
。 -
"bat"
排序后为"abt"
,哈希表更新为{ "aet": ["eat", "tea", "ate"], "ant": ["tan", "nat"], "abt": ["bat"] }
。
-
-
提取结果: 从哈希表提取组,结果为:
-
ret
变为[["eat", "tea", "ate"], ["tan", "nat"], ["bat"]]
。
-
-
返回结果:
-
返回结果数组
ret
。
-
相关文章:
哈希表(典型算法思想)—— OJ例题算法解析思路
目录 一、1. 两数之和 - 力扣(LeetCode) 算法代码: 1. 问题描述 2. 核心思路 3. 代码实现思路 (1)初始化哈希表 (2)遍历数组 (3)返回结果 4. 时间复杂度分析 …...
Linux软件编程——标准IO(2025.2.14)
目录 一、操作系统 1.重点内容 2.学习方法 二、文件操作 1. 必要性 2. Linux文件类型 3. Linux文件操作方法 4.文件操作思想 5.标准IO 6.函数接口 (1)fopen打开文件 (2)fputc字符写入文件 (3&#x…...
YOLOV8的学习记录(二) yolo8的几个内置模型简介
YOLOv8 是一个多功能的计算机视觉框架,支持多种任务,包括分类(Classify)、检测(Detect)、旋转目标检测(OBB)、姿态估计(Pose)、实例分割(Segment&…...
初阶c语言(练习题,猜随机数,关机程序)
目录 第一题,使用函数编写一个随机数,然后自己猜,猜随机数 第二道题(关机程序) 实现代码(关机程序) 实现代码(猜数字) 前言: 学习c语言,学习…...
中上211硕对嵌入式AI感兴趣,如何有效规划学习路径?
今天给大家分享的是一位粉丝的提问,中上211硕对嵌入式AI感兴趣,如何有效规划学习路径? 接下来把粉丝的具体提问和我的回复分享给大家,希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问: 中上211,…...
如何在wps中使用AI
1、访问官网:https://ai.wps.cn 2、 下载WPS AI客户端 3、本地安装, 安装时需要关闭wps 安装完成后打开wps,菜单中新增OfficeAI 点击【设置】按钮,弹出如下窗口 选择【大模型设置】中 模型平台选择(硅基流程…...
单例设计模式
简介 单例模式是设计模式中的创建型设计模式,用来保证一个类只能创建一个对象,通常包括饿汉式单例、懒汉式单例。 一、饿汉式单例 饿汉式单例是在类加载时就进行创建的,如: public class Apple {// 由于是单例,因…...
离线量化算法和工具 --学习记录1
离线量化算法和工具 一、离线量化的基础概念1.1、基本流程1.2、量化的优点和缺点1.3、如何生产一个硬件能跑的量化模型1.4、PTQ的概念以及和QAT的区别1.5、离线量化的标准流程1.6、校准数据的选择1.7、量化模式的选择1.8、校准方式的选择1.9、量化算法的选择1.10、写入量化参数…...
Redis 03章——10大数据类型概述
一、which10 (1)一图 (2)提前声明 这里说的数据类型是value的数据类型,key的类型都是字符串 官网:Understand Redis data types | Docs (3)分别是 1.3.1redis字符串࿰…...
芯麦GC6208:革新摄像机与医疗设备的智能音频解决方案
引言 在现代科技的推动下,音频设备和图像处理在各个领域的应用日益广泛。芯麦科技的GC6208是一款创新的音频处理芯片,具有高性能和多功能性,适用于摄像机、医疗设备等多种产品。本文将探讨GC6208在这些领域中的应用及其带来的优势。 1. 在摄…...
代码随想录算法营Day39 | 416. 分割等和子集
416. 分割等和子集 这题换句话说就是是否能找出一个子集,使这个子集的总和等于数组总和的一半,数组里每个元素只能选一次。我们确立一个dp数组,长度为数组总和的half1,内容为False。索引表示和,索引里的内容表示该数是…...
【前端】自己从头实现一个gpt聊天页面
预览 最小化功能点 主界面:侧边栏会话历史、聊天窗口发送和断开。侧边栏:展示会话列表,每个会话包含多条聊天记录, 通过localstorage本地储存和恢复,会话需要重命名和删除。聊天框:区分一下发送者和回答者…...
浅说树形dp
文章目录 前言树形dp的转移方式树形dp的使用的场景小结 初步感知——简单的树形dp例题1例题2 深入分析——树形dp的经典模型最大独立集最小点覆盖最小支配集树上直径 前言 因为树的形式非常适合递归,他所带来的访问顺序也是非常符合拓扑排序的,故而在处…...
Matlab 多项式曲线拟合(三维)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 对于高维空间曲线的拟合,参数化是一种非常好的方式,可以让我们很容易得到我们想要的目标曲线。 假设给定一组数据点 ( u i , x i ) 、 ( u i ...
大语言模型推理中的显存优化 有哪些
大语言模型推理中的显存优化 有哪些 目录 大语言模型推理中的显存优化 有哪些显存优化背景Offloading/Checkpoint原理举例显存优化背景 在大语言模型推理时,显存是显著瓶颈。以开源的BLOOM 176B模型为例,在8张A100计算卡上,通常对话设置下仅能进行批量为10左右的推理。为缓…...
机器学习:k均值
所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com),欢迎查看。 在“无监督学习”中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律&…...
【图像加密解密】空间混沌序列的图像加密解密算法复现(含相关性检验)【Matlab完整源码 2期】
1、说明 本文给出详细完整代码、完整的实验报告和PPT。 环境:MATLAB2019a 复现文献:[1]孙福艳,吕宗旺.Digital image encryption with chaotic map lattices[J].Chinese Physics B,2011,20(04):136-142. 2、部分报告内容 3 部分源码与运行步骤 3.1 部…...
Unity学习part3
此为b站视频【【Unity教程】零基础带你从小白到超神】 https://www.bilibili.com/video/BV1gQ4y1e7SS/?p55&share_sourcecopy_web&vd_source6e7a3cbb802eb986578ad26fae1eeaab的笔记 1、反向动力学 打开ik处理 public class PlayerMoveController : MonoBehaviour {…...
【2025最新版】软件测试面试题总结(150道题含答案解析)
接口测试面试题 1:你平常做接口测试的过程中发现过哪些 bug? 2:平常你是怎么测试接口的? 3:平常用什么工具测接口? 4: webService 接口是如何测试的? 5:没有接口文档,如何做接口测试? 6&…...
双轴伺服电机驱动控制器AGV、AMR专用双伺服电机驱动控制器解决方案
工业机器人数控机床XY机械手双轴机器人堆垛机专用双轴伺服电机驱动控制器48V 14ARMS带有STO功能,隔离高压CAN/RS485/USB通讯支持编码器和霍尔输入 双伺服电机驱动控制器TMCM2611功能介绍 集成2个伺服电机的控制和驱动于一体供电电压48V,驱动电流14A RM…...
知识图谱数据库 Neo4j in Docker笔记
下载 docker pull neo4j:community官方说明 https://neo4j.com/docs/operations-manual/2025.01/docker/introduction/ 启动 docker run \--restart always \--publish7474:7474 --publish7687:7687 \--env NEO4J_AUTHneo4j/your_password \--volumeD:\files\knowledgegrap…...
Kubernetes实战教程:基于Vue前端与Java后端的应用部署
在云原生时代,Kubernetes 已成为管理容器化应用的核心平台。本文不仅详细介绍了 Kubernetes 的背景、架构和核心特性,还将通过一个具体的案例——基于 Vue 前端和 Java 后端的应用部署,带你一步步了解如何在 Kubernetes 集群中构建和运行一个…...
完全数和质数算法详解
完全数是指一个正整数,它等于其所有真约数(即除了自身以外的所有正因数)之和。例如,6 是一个完全数,因为它的真约数是 1、2 和 3,且 1 2 3 6。 1 计算约数和 1.1 遍历 遍历其所有可能的约数并计算它们…...
PHP本地商家卡券管理系统
本地商家卡券管理系统 —— 引领智慧消费新时代 本地商家卡券管理系统,是基于ThinkPHPUni-appuView尖端技术匠心打造的一款微信小程序,它彻底颠覆了传统优惠方式,开创了多商家联合发行优惠卡、折扣券的全新模式,发卡类型灵活多变…...
使用动态规划解决 0/1 背包问题
1. 背景 背包问题是计算机科学和优化领域中的经典问题之一,它被广泛应用于资源分配、任务调度等问题。在最简单的形式下,0/1背包问题描述的是: 你有一个背包,能够容纳一定的重量,而你有若干个物品,每个物品都有一个重量和价值,问你应该如何选择物品,使得在不超过背包…...
探索Java中的集合类_特性与使用场景
1. 引言 1.1 Java集合框架概述 Java集合框架(Java Collections Framework, JCF)是Java中用于存储和操作一组对象的类和接口的统称。它提供了多种数据结构来满足不同的需求,如列表、集合、映射等。JCF的核心接口包括Collection、List、Set、Queue和Map,以及它们的各种实现…...
动态DNS神器nip.io使用指南:快速实现域名与IP的动态映射--告别配置本地hosts
动态DNS神器nip.io使用指南:快速实现域名与IP的动态映射--告别配置本地hosts 一、项目简介二、快速入门三、进阶配置四、典型应用场景 本文基于开源项目 v1.2.1版本撰写,适用于开发测试、CI/CD等场景 一、项目简介 nip.io 是由Exentrique Solutions开发…...
Obsidian及Zotero常用的插件
Obsidian插件 Minimal Theme Settings(Life,zotero)【必需】 界面样式设置所需插件 Style Settings(Life,zotero)【必需】界面样式设置所需插件 Recent Files(Life,zotero…...
自学Java-面向对象高级(final、单例类、枚举类、抽象类、接口)
自学Java-面向对象高级(final、单例类、枚举类、抽象类、接口) 一、final关键字1、认识final关键字2、final修饰变量的注意3、常量 二、单例类(设计模式)1、设计模式的概念2、单例设计模式3、单例类有很多形式4、懒汉式单例类5、小…...
数据结构与算法之排序算法-归并排序
排序算法是数据结构与算法中最基本的算法之一,其作用就是将一些可以比较大小的数据进行有规律的排序,而想要实现这种排序就拥有很多种方法~ 那么我将通过几篇文章,将排序算法中各种算法细化的,详尽的为大家呈现出来: …...
Springboot整合ES
添加依赖 在 pom.xml 中添加以下依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>配置 Elasticsearch 在 application.proper…...
文件夹上传到github分支最后github上面还是没有文件和文件夹
环境: github 问题描述: 文件夹上传到github分支最后github上面还是没有文件和文件夹, 和这样一样 解决方案: 从 git ls-tree -r HEAD 的输出中可以看到,metahuman-stream 文件夹显示为如下内容: 160000 commi…...
生成式聊天机器人 -- 基于Transformer实现的SeqToSeq模型 -- 上
生成式聊天机器人 -- 基于Transformer实现的SeqToSeq模型 -- 上 引言数据预处理下载并处理数据数据加载 Transformer模型嵌入层&位置编码层多头注意力机制EncoderLayerDecoderLayerPoint-wise Feed Forward NetworkTransformer 引言 在此之前,我们已经了解了如…...
【Java 面试 八股文】Spring Cloud 篇
Spring Cloud 篇 1. Spring Cloud 5大组件有哪些?2. 服务注册和发现是什么意思?Spring Cloud 如何实现服务注册发现?3. 我看你之前也用过nacos,你能说下nacos与eureka的区别?4. 你们项目负载均衡如何实现的?…...
CAS单点登录(第7版)10.多因素身份验证
如有疑问,请看视频:CAS单点登录(第7版) 多因素身份验证 概述 多因素身份验证 (MFA) 多因素身份验证(Multifactor Authentication MFA)是一种安全机制,要求用户提供两种…...
【16】思科AireOS:创建使用 LWA 认证的 WLAN
1. 概述 LWA(Local Web Authentication)是一种基于 Web 认证的方式,允许无线客户端在连接 WLAN 后,使用 Web 认证页面进行身份验证。该方法适用于访客网络或需要身份认证的场景。 本指南详细介绍如何在 Cisco AireOS 无线控制器(WLC)上配置 LWA 认证的 WLAN,并确保认证…...
webassembly009 transformers.js 网页端侧推理 whisper-web
whisper-web https://github.com/xenova/whisper-web 页面结构 AudioManager: 该组件负责音频的录制和处理。它会使用 Web API 来访问麦克风,录制音频数据,并将其传递给 transcriber 进行转录。它通过 transcriber 管理转录状态,音频数据将…...
vscode使用常见问题处理合集
目录 一、使用vite创建的vue3项目,script和style首行代码不会缩进,且格式化属性字段等会换行问题 首行缩进情况如下: 属性、参数格式化换行情况如下: 解决方式: 一、使用vite创建的vue3项目,script和style首行代码不…...
EasyExcel提取excel文档
目录 一、前言二、提取excel文档2.1、所有sheet----获取得到headerList和总行数2.2、所有sheet----获取合并单元格信息2.3、读取某个sheet的每行数据一、前言 EasyExcel 是阿里巴巴开源的一个高性能 Excel 读写库,相比于 Apache POI 和 JXL,它有明显的优势,特别是在处理大数…...
DeepSeek v3 技术报告阅读笔记
注 本文参考 DeepSeek-v3 / v2 / v1 Technical Report 及相关参考模型论文本文不包括基础的知识点讲解,为笔记/大纲性质而非教程,建议阅读技术报告原文交流可发送至邮箱 henryhua0721foxmail.com 架构核心 核心: MLA 高效推理DeepSeekMOE 更…...
Python爬虫-猫眼电影的影院数据
前言 本文是该专栏的第46篇,后面会持续分享python爬虫干货知识,记得关注。 本文笔者以猫眼电影为例子,获取猫眼的影院相关数据。 废话不多说,具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码) …...
每天五分钟深度学习框架pytorch:搭建谷歌的Inception网络模块
本文重点 前面我们学习了VGG,从现在开始我们将学习谷歌公司推出的GoogLeNet。当年ImageNet竞赛的第二名是VGG,而第一名就是GoogLeNet,它的模型设计拥有很多的技巧,这个model证明了一件事:用更多的卷积,更深的层次可以得到更好的结构 GoogLeNet的网络结构 如图所示就是Go…...
export default与export区别
1.定义: export default:用于导出模块中的默认成员。一个模块中只能有一个export default,通常用于导出模块的主要功能或对象。导入时可以使用任意名称,因为它没有具体的名称 export:用于导出模块中的多个成…...
当Ollama遇上划词翻译:我的Windows本地AI服务搭建日记
🚀 实现Windows本地大模型翻译服务 - 基于OllamaFlask的划词翻译实践 🛠️ 步骤概要1️⃣ python 环境准备2️⃣ Ollama 安装3️⃣ 一个 Flask 服务4️⃣ Windows 服务化封装5️⃣ 测试本地接口6️⃣ 配置划词翻译自定义翻译源7️⃣ 效果展示8️⃣ debug…...
5G与物联网的协同发展:打造智能城市的未来
引言 随着科技的不断进步,智能城市的概念已经不再是科幻小说中的幻想,它正在逐步走进我们的生活。而这背后的两大驱动力无疑是 5G和 物联网(IoT)。5G网络以其高速率、低延迟、大容量的优势,与物联网的强大连接能力相结…...
并发编程---synchronized关键字,以及synchronized同步锁
文章目录 Synchronized 的使用synchronized 在普通方法上的使用(对象锁)synchronized 在静态方法上的使用(类锁)synchronized 在代码块上的使用 JVM 中锁的优化锁的类型自旋锁与自适应自旋锁自旋锁(Spin Lockÿ…...
Vue学习笔记5(Vue3)
Vue3学习笔记 一、create-vue搭建vue3项目 create-vue是vue官方新的脚手架工具,底层切换到了vite 步骤: 查看环境条件 node -v版本需要在16.0及以上创建一个vue应用 npm init vuelatest 这一指令会安装并执行create-vue 二、项目目录和关键文件 in…...
VoIP之音视频会议中的混音技术
在VoIP音视频会议中,需要将多路参会方音频流混合成一路音频流再发送给各参会方,以达到参会方可以听到每个与会人声音的目的,这种技术叫混音。 一、混音基础原理 在实际生活中,我们所处的生活和工作环境就是一个自然的混音场&…...
Baklib一站式云平台:全场景赋能企业知识资产激活
内容概要 在数字化浪潮推动下,企业知识资产的高效管理与价值释放成为核心议题。Baklib作为一站式云平台,以全场景赋能为核心定位,通过构建知识中台架构,为企业提供从资源整合到应用落地的闭环解决方案。该平台不仅支持文本、图像…...
基于nuScenes数据集和DeepSeek模型的端到端自动驾驶解决方案
结合DeepSeek模型进行知识蒸馏,以提高模型性能。这需要将nuScenes中的多模态数据(如摄像头图像、雷达点云、车辆状态等)整合到模型中,同时使用DeepSeek的生成能力进行蒸馏。 接下来,我需要考虑用户可能的背景。用户可能…...