【2024年华为OD机试】 (E卷,200分) - 寻找符合要求的最长子串(JavaScriptJava PythonC/C++)
一、问题描述
给定一个字符串 s
,找出满足以下条件的最长子串:
- 任意一个字符最多出现2次:子串中的每个字符在子串中出现的次数不能超过2次。
- 子串不包含指定字符:子串不能包含输入的指定字符。
请找出满足该条件的最长子串的长度。
输入描述
- 第一行:要求不包含的指定字符,为单个字符,取值范围为
[0-9a-zA-Z]
。 - 第二行:字符串
s
,每个字符范围为[0-9a-zA-Z]
,长度范围为[1, 10000]
。
输出描述
- 输出满足条件的最长子串的长度。
示例分析
示例 1
输入
D
ABC123
输出
6
分析
- 排除字符为
D
。 - 字符串
s
为ABC123
。 - 整个字符串
ABC123
不包含字符D
,并且每个字符都没有超过2次,因此整个字符串符合条件。 - 满足条件的最长子串为
ABC123
,长度为6
。
示例 2
输入
D
ABACA123D
输出
7
分析
- 排除字符为
D
。 - 字符串
s
为ABACA123D
。 - 从
s
中找一个最长的子串,该子串:- 不包含字符
D
。 - 任意一个字符出现次数不超过2次。
- 不包含字符
- 在字符串
ABACA123D
中,有多个子串不包含D
,但需要满足字符出现次数不超过2次的条件:BACA123
是一个符合条件的子串,每个字符最多出现2次,并且长度为7
。
- 因此,满足条件的最长子串为
BACA123
,长度为7
。
解题思路
问题分解
- 排除指定字符:子串不能包含输入的指定字符。
- 字符出现次数限制:子串中的每个字符最多出现2次。
解决思路
- 滑动窗口:使用滑动窗口的思想,维护一个窗口,窗口内的字符满足以下条件:
- 不包含指定字符。
- 每个字符的出现次数不超过2次。
- 窗口扩展与收缩:
- 扩展窗口:将字符加入窗口,并统计字符的出现次数。
- 收缩窗口:如果某个字符的出现次数超过2次,或者窗口包含指定字符,则收缩窗口的左边界。
- 记录最大长度:在窗口扩展和收缩的过程中,记录满足条件的窗口的最大长度。
关键点
- 字符统计:使用哈希表(或数组)统计窗口中每个字符的出现次数。
- 窗口边界调整:根据字符的出现次数和是否包含指定字符,动态调整窗口的左右边界。
- 时间复杂度:滑动窗口的时间复杂度为
O(n)
,其中n
是字符串的长度。
总结
本题的核心是通过滑动窗口的思想,动态维护一个满足条件的子串窗口,并记录窗口的最大长度。关键在于:
- 排除指定字符。
- 限制字符的出现次数。
- 高效地调整窗口边界。
通过合理的滑动窗口实现,可以在 O(n)
的时间复杂度内解决问题。
二、JavaScript算法源码
代码解析
以下是 JavaScript 代码的详细解析,包括功能、实现思路以及关键点说明。
1. 输入处理
const rl = readline.createInterface({input: process.stdin,output: process.stdout
});let exclude = '';
let s = '';rl.on('line', (input) => {if (!exclude) {exclude = input;} else {s = input;
- 功能:从输入中读取要排除的字符
exclude
和字符串s
。 - 实现:
- 使用
readline
模块创建接口,监听输入。 - 第一次输入为
exclude
,第二次输入为s
。
- 使用
2. 数据结构初始化
const excludeChar = exclude[0];
const charIndexMap = {};
let left = 0;
let right = 0;
let maxLength = 0;
- 功能:初始化用于存储字符出现下标的数据结构,以及滑动窗口的左右指针和最大长度变量。
- 实现:
excludeChar
:提取exclude
的第一个字符作为要排除的字符。charIndexMap
:用于存储每个字符在字符串中出现的下标列表。left
和right
:滑动窗口的左右指针,初始化为0
。maxLength
:记录满足条件的最长子串长度,初始化为0
。
3. 滑动窗口遍历
while (right < s.length) {const currentChar = s[right];
- 功能:遍历字符串
s
,使用滑动窗口寻找满足条件的最长子串。 - 实现:
- 使用
while
循环遍历字符串,right
指针从0
开始向右移动。
- 使用
4. 处理排除字符
if (excludeChar === currentChar) {if (right > left) {maxLength = Math.max(maxLength, right - left);}right++;left = right;
}
- 功能:如果当前字符是排除字符,则更新窗口并重置指针。
- 实现:
- 如果当前字符是排除字符:
- 检查当前窗口是否有效(
right > left
),如果有效则更新maxLength
。 - 将
left
和right
指针移动到下一个位置,跳过排除字符。
- 检查当前窗口是否有效(
- 如果当前字符是排除字符:
5. 处理非排除字符
else {charIndexMap[currentChar] = charIndexMap[currentChar] || [];const charIndexes = charIndexMap[currentChar];if (charIndexes.length === 2) {maxLength = Math.max(maxLength, right - left);left = charIndexes[0] + 1;charIndexes.shift();}charIndexes.push(right);right++;
}
- 功能:如果当前字符不是排除字符,则更新字符出现次数并调整窗口。
- 实现:
- 初始化当前字符的下标列表(如果不存在)。
- 如果当前字符已经出现 2 次:
- 更新
maxLength
。 - 将
left
指针移动到当前字符第一次出现位置的下一个位置。 - 移除当前字符的第一次出现下标。
- 更新
- 将当前字符的下标加入列表,并移动
right
指针。
6. 检查最后一个窗口
maxLength = Math.max(maxLength, right - left);
- 功能:在遍历结束后,检查最后一个窗口是否满足条件。
- 实现:
- 更新
maxLength
,确保最后一个窗口的长度被考虑。
- 更新
7. 输出结果
console.log(maxLength);
rl.close();
- 功能:输出满足条件的最长子串长度。
- 实现:
- 打印
maxLength
。 - 关闭
readline
接口。
- 打印
关键点说明
-
滑动窗口:
- 使用
left
和right
指针维护一个窗口,窗口内的字符满足以下条件:- 不包含排除字符。
- 每个字符的出现次数不超过 2 次。
- 使用
-
字符下标存储:
- 使用
charIndexMap
对象存储每个字符在字符串中出现的下标列表。 - 当某个字符出现 2 次时,通过移动
left
指针来调整窗口。
- 使用
-
时间复杂度:
- 遍历字符串一次,时间复杂度为
O(n)
,其中n
是字符串的长度。
- 遍历字符串一次,时间复杂度为
-
空间复杂度:
- 使用
charIndexMap
存储字符的下标列表,空间复杂度为O(m)
,其中m
是字符集的大小。
- 使用
示例运行
示例 1
- 输入:
D ABC123
- 运行过程:
- 排除字符为
D
。 - 字符串
ABC123
不包含D
,且每个字符出现次数不超过 2 次。 - 最大长度为
6
。
- 排除字符为
- 输出:
6
示例 2
- 输入:
D ABACA123D
- 运行过程:
- 排除字符为
D
。 - 最长子串为
BACA123
,长度为7
。
- 排除字符为
- 输出:
7
总结
该代码通过滑动窗口和字符下标存储的方式,高效地解决了问题。其核心思想是动态调整窗口边界,确保窗口内的字符满足条件,并记录最大长度。JavaScript 的实现简洁且易于理解,适合处理类似问题。
三、Java算法源码
代码解析
以下是代码的详细解析,包括功能、实现思路以及关键点说明。
1. 输入处理
Scanner scanner = new Scanner(System.in);
String exclude = scanner.next();
String s = scanner.next();
char excludeChar = exclude.charAt(0);
- 功能:从输入中读取要排除的字符
exclude
和字符串s
。 - 实现:
- 使用
Scanner
读取输入。 - 提取
exclude
的第一个字符作为要排除的字符excludeChar
。
- 使用
2. 数据结构初始化
Map<Character, List<Integer>> charIndexMap = new HashMap<>();
int left = 0, right = 0;
int maxLength = 0;
- 功能:初始化用于存储字符出现下标的数据结构,以及滑动窗口的左右指针和最大长度变量。
- 实现:
charIndexMap
:用于存储每个字符在字符串中出现的下标列表。left
和right
:滑动窗口的左右指针,初始化为0
。maxLength
:记录满足条件的最长子串长度,初始化为0
。
3. 滑动窗口遍历
while (right < s.length()) {char currentChar = s.charAt(right);
- 功能:遍历字符串
s
,使用滑动窗口寻找满足条件的最长子串。 - 实现:
- 使用
while
循环遍历字符串,right
指针从0
开始向右移动。
- 使用
4. 处理排除字符
if (excludeChar == currentChar) {if (right > left) {maxLength = Math.max(maxLength, right - left);}right++;left = right;
}
- 功能:如果当前字符是排除字符,则更新窗口并重置指针。
- 实现:
- 如果当前字符是排除字符:
- 检查当前窗口是否有效(
right > left
),如果有效则更新maxLength
。 - 将
left
和right
指针移动到下一个位置,跳过排除字符。
- 检查当前窗口是否有效(
- 如果当前字符是排除字符:
5. 处理非排除字符
else {charIndexMap.computeIfAbsent(currentChar, k -> new ArrayList<>());List<Integer> charIndexes = charIndexMap.get(currentChar);if (charIndexes.size() == 2) {maxLength = Math.max(maxLength, right - left);left = charIndexes.get(0) + 1;charIndexes.remove(0);}charIndexes.add(right);right++;
}
- 功能:如果当前字符不是排除字符,则更新字符出现次数并调整窗口。
- 实现:
- 初始化当前字符的下标列表(如果不存在)。
- 如果当前字符已经出现 2 次:
- 更新
maxLength
。 - 将
left
指针移动到当前字符第一次出现位置的下一个位置。 - 移除当前字符的第一次出现下标。
- 更新
- 将当前字符的下标加入列表,并移动
right
指针。
6. 检查最后一个窗口
maxLength = Math.max(maxLength, right - left);
- 功能:在遍历结束后,检查最后一个窗口是否满足条件。
- 实现:
- 更新
maxLength
,确保最后一个窗口的长度被考虑。
- 更新
7. 输出结果
System.out.println(maxLength);
- 功能:输出满足条件的最长子串长度。
- 实现:
- 打印
maxLength
。
- 打印
关键点说明
-
滑动窗口:
- 使用
left
和right
指针维护一个窗口,窗口内的字符满足以下条件:- 不包含排除字符。
- 每个字符的出现次数不超过 2 次。
- 使用
-
字符下标存储:
- 使用
Map<Character, List<Integer>>
存储每个字符在字符串中出现的下标列表。 - 当某个字符出现 2 次时,通过移动
left
指针来调整窗口。
- 使用
-
时间复杂度:
- 遍历字符串一次,时间复杂度为
O(n)
,其中n
是字符串的长度。
- 遍历字符串一次,时间复杂度为
-
空间复杂度:
- 使用
Map
存储字符的下标列表,空间复杂度为O(m)
,其中m
是字符集的大小。
- 使用
示例运行
示例 1
- 输入:
D ABC123
- 运行过程:
- 排除字符为
D
。 - 字符串
ABC123
不包含D
,且每个字符出现次数不超过 2 次。 - 最大长度为
6
。
- 排除字符为
- 输出:
6
示例 2
- 输入:
D ABACA123D
- 运行过程:
- 排除字符为
D
。 - 最长子串为
BACA123
,长度为7
。
- 排除字符为
- 输出:
7
总结
该代码通过滑动窗口和字符下标存储的方式,高效地解决了问题。其核心思想是动态调整窗口边界,确保窗口内的字符满足条件,并记录最大长度。
四、Python算法源码
代码解析
以下是 Python 代码的详细解析,包括功能、实现思路以及关键点说明。
1. 输入处理
exclude = input()
s = input()
excludeChar = exclude[0]
- 功能:从输入中读取要排除的字符
exclude
和字符串s
。 - 实现:
- 使用
input()
读取输入。 - 提取
exclude
的第一个字符作为要排除的字符excludeChar
。
- 使用
2. 数据结构初始化
charIndexMap = defaultdict(list)
left = 0
right = 0
maxLength = 0
- 功能:初始化用于存储字符出现下标的数据结构,以及滑动窗口的左右指针和最大长度变量。
- 实现:
charIndexMap
:使用defaultdict(list)
存储每个字符在字符串中出现的下标列表。left
和right
:滑动窗口的左右指针,初始化为0
。maxLength
:记录满足条件的最长子串长度,初始化为0
。
3. 滑动窗口遍历
while right < len(s):currentChar = s[right]
- 功能:遍历字符串
s
,使用滑动窗口寻找满足条件的最长子串。 - 实现:
- 使用
while
循环遍历字符串,right
指针从0
开始向右移动。
- 使用
4. 处理排除字符
if excludeChar == currentChar:if right > left:maxLength = max(maxLength, right - left)right += 1left = right
- 功能:如果当前字符是排除字符,则更新窗口并重置指针。
- 实现:
- 如果当前字符是排除字符:
- 检查当前窗口是否有效(
right > left
),如果有效则更新maxLength
。 - 将
left
和right
指针移动到下一个位置,跳过排除字符。
- 检查当前窗口是否有效(
- 如果当前字符是排除字符:
5. 处理非排除字符
else:charIndexMap[currentChar]charIndexes = charIndexMap[currentChar]if len(charIndexes) == 2:maxLength = max(maxLength, right - left)left = charIndexes[0] + 1charIndexes.pop(0)charIndexes.append(right)right += 1
- 功能:如果当前字符不是排除字符,则更新字符出现次数并调整窗口。
- 实现:
- 初始化当前字符的下标列表(如果不存在)。
- 如果当前字符已经出现 2 次:
- 更新
maxLength
。 - 将
left
指针移动到当前字符第一次出现位置的下一个位置。 - 移除当前字符的第一次出现下标。
- 更新
- 将当前字符的下标加入列表,并移动
right
指针。
6. 检查最后一个窗口
maxLength = max(maxLength, right - left)
- 功能:在遍历结束后,检查最后一个窗口是否满足条件。
- 实现:
- 更新
maxLength
,确保最后一个窗口的长度被考虑。
- 更新
7. 输出结果
print(maxLength)
- 功能:输出满足条件的最长子串长度。
- 实现:
- 打印
maxLength
。
- 打印
关键点说明
-
滑动窗口:
- 使用
left
和right
指针维护一个窗口,窗口内的字符满足以下条件:- 不包含排除字符。
- 每个字符的出现次数不超过 2 次。
- 使用
-
字符下标存储:
- 使用
defaultdict(list)
存储每个字符在字符串中出现的下标列表。 - 当某个字符出现 2 次时,通过移动
left
指针来调整窗口。
- 使用
-
时间复杂度:
- 遍历字符串一次,时间复杂度为
O(n)
,其中n
是字符串的长度。
- 遍历字符串一次,时间复杂度为
-
空间复杂度:
- 使用
defaultdict
存储字符的下标列表,空间复杂度为O(m)
,其中m
是字符集的大小。
- 使用
示例运行
示例 1
- 输入:
D ABC123
- 运行过程:
- 排除字符为
D
。 - 字符串
ABC123
不包含D
,且每个字符出现次数不超过 2 次。 - 最大长度为
6
。
- 排除字符为
- 输出:
6
示例 2
- 输入:
D ABACA123D
- 运行过程:
- 排除字符为
D
。 - 最长子串为
BACA123
,长度为7
。
- 排除字符为
- 输出:
7
总结
该代码通过滑动窗口和字符下标存储的方式,高效地解决了问题。其核心思想是动态调整窗口边界,确保窗口内的字符满足条件,并记录最大长度。Python 的实现简洁且易于理解,适合处理类似问题。
五、C/C++算法源码:
C++ 代码详细注释与讲解
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;int main() {// 输入exclude和sstring exclude, s;cin >> exclude >> s;// 获取要排除的字符char excludeChar = exclude[0];// 存储每个字符出现的下标unordered_map<char, vector<int>> charIndexMap;// 定义左右指针int left = 0, right = 0;// 定义最长子串长度int maxLength = 0;// 遍历字符串while (right < s.length()) {char currentChar = s[right];// 如果当前字符是要排除的字符if (excludeChar == currentChar) {// 如果左右指针不在同一位置,说明存在符合条件的子串if (right > left) {maxLength = max(maxLength, right - left);}// 将左右指针都移动到下一个位置right++;left = right;} else {// 如果当前字符不是要排除的字符// 先将当前字符在map中初始化charIndexMap[currentChar];vector<int>& charIndexes = charIndexMap[currentChar];// 如果当前字符的出现次数已经超过2次if (charIndexes.size() == 2) {// 更新最长子串长度maxLength = max(maxLength, right - left);// 将左指针移动到当前字符上一次出现的位置的下一个位置left = charIndexes[0] + 1;// 删除当前字符在map中的第一个下标charIndexes.erase(charIndexes.begin());}// 将当前字符的下标加入map中charIndexes.push_back(right);// 右指针向后移动right++;}}// 检查最后一个子串是否符合条件maxLength = max(maxLength, right - left);// 输出最长子串长度cout << maxLength << endl;return 0;
}
代码讲解:
-
输入处理:
exclude
是一个字符串,但我们只需要它的第一个字符excludeChar
,表示要排除的字符。s
是我们要处理的字符串。
-
数据结构:
charIndexMap
是一个unordered_map
,用于存储每个字符在字符串s
中出现的位置(下标)。key
是字符,value
是一个vector<int>
,存储该字符出现的所有下标。
-
双指针:
left
和right
是两个指针,用于表示当前子串的左右边界。maxLength
用于记录当前找到的最长子串的长度。
-
遍历字符串:
- 使用
right
指针遍历字符串s
。 - 如果当前字符
currentChar
是要排除的字符excludeChar
,则:- 如果
right > left
,说明当前子串是符合条件的(不包含excludeChar
),更新maxLength
。 - 将
left
和right
都移动到下一个位置,重新开始寻找新的子串。
- 如果
- 如果当前字符不是要排除的字符,则:
- 将该字符的下标存入
charIndexMap
。 - 如果该字符已经出现过两次,则:
- 更新
maxLength
。 - 将
left
移动到该字符第一次出现的位置的下一个位置,并删除该字符第一次出现的下标。
- 更新
- 继续移动
right
指针。
- 将该字符的下标存入
- 使用
-
最后的检查:
- 在遍历结束后,检查最后一个子串是否符合条件,并更新
maxLength
。
- 在遍历结束后,检查最后一个子串是否符合条件,并更新
-
输出结果:
- 输出
maxLength
,即最长子串的长度。
- 输出
C 语言代码详细注释与讲解
#include <stdio.h>
#include <string.h>#define MAX_LENGTH 10000// 用于存储每个字符的出现下标
int charIndexMap[128][3];int main() {char excludeChar;char s[MAX_LENGTH + 1];// 读取排除字符和字符串scanf("%c", &excludeChar);scanf("%s", s);// 初始化存储字符下标的数组for (int i = 0; i < 128; i++) {charIndexMap[i][0] = charIndexMap[i][1] = -1;}int left = 0, right = 0;int maxLength = 0;int length = strlen(s);// 遍历字符串while (right < length) {char currentChar = s[right];// 如果当前字符是要排除的字符if (currentChar == excludeChar) {if (right > left) {maxLength = right - left > maxLength ? right - left : maxLength;}right++;left = right;} else {// 如果当前字符不是要排除的字符int* charIndexes = charIndexMap[currentChar];// 如果当前字符的出现次数已经超过2次if (charIndexes[1] != -1) {maxLength = right - left > maxLength ? right - left : maxLength;left = charIndexes[0] + 1;charIndexes[0] = charIndexes[1];charIndexes[1] = -1;}// 将当前字符的下标加入到数组中if (charIndexes[0] == -1) {charIndexes[0] = right;} else {charIndexes[1] = right;}// 右指针向后移动right++;}}// 检查最后一个子串是否符合条件maxLength = right - left > maxLength ? right - left : maxLength;// 输出最长子串长度printf("%d\n", maxLength);return 0;
}
代码讲解:
-
输入处理:
excludeChar
是要排除的字符。s
是我们要处理的字符串,最大长度为MAX_LENGTH
。
-
数据结构:
charIndexMap
是一个二维数组,用于存储每个字符在字符串s
中出现的位置(下标)。charIndexMap[i][0]
和charIndexMap[i][1]
分别存储字符i
的第一次和第二次出现的下标。
-
初始化:
- 将
charIndexMap
中的所有值初始化为-1
,表示该字符尚未出现。
- 将
-
双指针:
left
和right
是两个指针,用于表示当前子串的左右边界。maxLength
用于记录当前找到的最长子串的长度。
-
遍历字符串:
- 使用
right
指针遍历字符串s
。 - 如果当前字符
currentChar
是要排除的字符excludeChar
,则:- 如果
right > left
,说明当前子串是符合条件的(不包含excludeChar
),更新maxLength
。 - 将
left
和right
都移动到下一个位置,重新开始寻找新的子串。
- 如果
- 如果当前字符不是要排除的字符,则:
- 将该字符的下标存入
charIndexMap
。 - 如果该字符已经出现过两次,则:
- 更新
maxLength
。 - 将
left
移动到该字符第一次出现的位置的下一个位置,并将第二次出现的下标移动到第一次的位置。
- 更新
- 继续移动
right
指针。
- 将该字符的下标存入
- 使用
-
最后的检查:
- 在遍历结束后,检查最后一个子串是否符合条件,并更新
maxLength
。
- 在遍历结束后,检查最后一个子串是否符合条件,并更新
-
输出结果:
- 输出
maxLength
,即最长子串的长度。
- 输出
总结
- C++ 代码 使用了
unordered_map
来存储字符的下标,利用vector
来动态存储每个字符的出现位置。 - C 语言代码 使用了二维数组
charIndexMap
来存储字符的下标,数组的大小固定为 128(ASCII 字符集)。 - 两者的核心逻辑相似,都是通过双指针和滑动窗口的思想来寻找不包含特定字符的最长子串。
六、尾言
什么是华为OD?
华为OD(Outsourcing Developer,外包开发工程师)是华为针对软件开发工程师岗位的一种招聘形式,主要包括笔试、技术面试以及综合面试等环节。尤其在笔试部分,算法题的机试至关重要。
为什么刷题很重要?
-
机试是进入技术面的第一关:
华为OD机试(常被称为机考)主要考察算法和编程能力。只有通过机试,才能进入后续的技术面试环节。 -
技术面试需要手撕代码:
技术一面和二面通常会涉及现场编写代码或算法题。面试官会注重考察候选人的思路清晰度、代码规范性以及解决问题的能力。因此提前刷题、多练习是通过面试的重要保障。 -
入职后的可信考试:
入职华为后,还需要通过“可信考试”。可信考试分为三个等级:- 入门级:主要考察基础算法与编程能力。
- 工作级:更贴近实际业务需求,可能涉及复杂的算法或与工作内容相关的场景题目。
- 专业级:最高等级,考察深层次的算法以及优化能力,与薪资直接挂钩。
刷题策略与说明:
2024年8月14日之后,华为OD机试的题库转为 E卷,由往年题库(D卷、A卷、B卷、C卷)和全新题目组成。刷题时可以参考以下策略:
-
关注历年真题:
- 题库中的旧题占比较大,建议优先刷历年的A卷、B卷、C卷、D卷题目。
- 对于每道题目,建议深度理解其解题思路、代码实现,以及相关算法的适用场景。
-
适应新题目:
- E卷中包含全新题目,需要掌握全面的算法知识和一定的灵活应对能力。
- 建议关注新的刷题平台或交流群,获取最新题目的解析和动态。
-
掌握常见算法:
华为OD考试通常涉及以下算法和数据结构:- 排序算法(快速排序、归并排序等)
- 动态规划(背包问题、最长公共子序列等)
- 贪心算法
- 栈、队列、链表的操作
- 图论(最短路径、最小生成树等)
- 滑动窗口、双指针算法
-
保持编程规范:
- 注重代码的可读性和注释的清晰度。
- 熟练使用常见编程语言,如C++、Java、Python等。
如何获取资源?
-
官方参考:
- 华为招聘官网或相关的招聘平台会有一些参考信息。
- 华为OD的相关公众号可能也会发布相关的刷题资料或学习资源。
-
加入刷题社区:
- 找到可信的刷题交流群,与其他备考的小伙伴交流经验。
- 关注知名的刷题网站,如LeetCode、牛客网等,这些平台上有许多华为OD的历年真题和解析。
-
寻找系统性的教程:
- 学习一本经典的算法书籍,例如《算法导论》《剑指Offer》《编程之美》等。
- 完成系统的学习课程,例如数据结构与算法的在线课程。
积极心态与持续努力:
刷题的过程可能会比较枯燥,但它能够显著提升编程能力和算法思维。无论是为了通过华为OD的招聘考试,还是为了未来的职业发展,这些积累都会成为重要的财富。
考试注意细节
-
本地编写代码
- 在本地 IDE(如 VS Code、PyCharm 等)上编写、保存和调试代码,确保逻辑正确后再复制粘贴到考试页面。这样可以减少语法错误,提高代码准确性。
-
调整心态,保持冷静
- 遇到提示不足或实现不确定的问题时,不必慌张,可以采用更简单或更有把握的方法替代,确保思路清晰。
-
输入输出完整性
- 注意训练和考试时都需要编写完整的输入输出代码,尤其是和题目示例保持一致。完成代码后务必及时调试,确保功能符合要求。
-
快捷键使用
- 删除行可用
Ctrl+D
,复制、粘贴和撤销分别为Ctrl+C
,Ctrl+V
,Ctrl+Z
,这些可以正常使用。 - 避免使用
Ctrl+S
,以免触发浏览器的保存功能。
- 删除行可用
-
浏览器要求
- 使用最新版的 Google Chrome 浏览器完成考试,确保摄像头开启并正常工作。考试期间不要切换到其他网站,以免影响考试成绩。
-
交卷相关
- 答题前,务必仔细查看题目示例,避免遗漏要求。
- 每完成一道题后,点击【保存并调试】按钮,多次保存和调试是允许的,系统会记录得分最高的一次结果。完成所有题目后,点击【提交本题型】按钮。
- 确保在考试结束前提交试卷,避免因未保存或调试失误而丢分。
-
时间和分数安排
- 总时间:150 分钟;总分:400 分。
- 试卷结构:2 道一星难度题(每题 100 分),1 道二星难度题(200 分)。及格分为 150 分。合理分配时间,优先完成自己擅长的题目。
-
考试环境准备
- 考试前请备好草稿纸和笔。考试中尽量避免离开座位,确保监控画面正常。
- 如需上厕所,请提前规划好时间以减少中途离开监控的可能性。
-
技术问题处理
- 如果考试中遇到断电、断网、死机等技术问题,可以关闭浏览器并重新打开试卷链接继续作答。
- 出现其他问题,请第一时间联系 HR 或监考人员进行反馈。
祝你考试顺利,取得理想成绩!
相关文章:
【2024年华为OD机试】 (E卷,200分) - 寻找符合要求的最长子串(JavaScriptJava PythonC/C++)
一、问题描述 给定一个字符串 s,找出满足以下条件的最长子串: 任意一个字符最多出现2次:子串中的每个字符在子串中出现的次数不能超过2次。子串不包含指定字符:子串不能包含输入的指定字符。 请找出满足该条件的最长子串的长度…...
c++常见设计模式之装饰器模式
基础介绍 装饰器模式是结构型设计模式,从字面意思看装饰器设计模式就是用来解决在原有的实现基础上添加一些额外的实现的问题。那么正统的概念是什么呢?装饰器模式允许我们动态的向对象添加新的 行为,同时不改变其原有的结构。它是一种比继承…...
如何在Python中进行数据分析?
数据分析是现代数据科学中的核心环节之一,它能够帮助我们从数据中提取有价值的信息,并为决策提供依据。在Python中,进行数据分析非常方便,因为Python有着丰富的库和工具,能够帮助处理和分析各种类型的数据。本篇文章将…...
linux网络 | 传输层TCP | 认识tcp报头字段与分离
前言: 本节内容继续传输层的讲解, 本节讲解的是tcp协议。 tcp协议是我们日常中最常用的协议。就比如我们浏览网页,我们知道网页时http或者https协议。 其实http或者https底层就是用的tcp协议。tcp协议,全名又称为传输控制协议&…...
定位,用最通俗易懂的方法2.1:CRLB实例
二郎就不设置什么VIP可见啥的了,这样大家都能看到。 如果觉得受益,可以给予一些打赏,也算对原创的一些鼓励,谢谢。 钱的用途:1)布施给他人;2)二郎会有更多空闲时间写教程 起因&…...
深入内核讲明白Android Binder【三】
深入内核讲明白Android Binder【三】 前言一、服务的获取过程内核源码解析1. 客户端获取服务的用户态源码回顾2. 客户端获取服务的内核源码分析2.1 客户端向service_manager发送数据1. binder_ioctl2. binder_ioctl_write_read3. binder_thread_write4. binder_transaction4.1 …...
vim如何显示行号
:set nu 显示行号 :set nonu 不显示行号...
【线性代数】列主元法求矩阵的逆
列主元方法是一种用于求解矩阵逆的数值方法,特别适用于在计算机上实现。其基本思想是通过高斯消元法将矩阵转换为上三角矩阵,然后通过回代求解矩阵的逆。以下是列主元方法求解矩阵 A A A 的逆的步骤: [精确算法] 列主元高斯消元法 步骤 1&am…...
T-SQL语言的数据库编程
T-SQL语言的数据库编程 1. 引言 在信息化迅速发展的今天,数据库已经成为数据管理和使用的重要工具。其中,T-SQL(Transact-SQL)作为微软SQL Server的扩展SQL语言,不仅用于数据查询和管理,还能够进行复杂的…...
【Linux】18.Linux进程控制(2)
文章目录 3. 进程程序替换3.1 单进程版 -- 看看程序替换3.2 替换原理3.3 替换函数函数解释命名理解 3.4 多进程版 -- 验证各种程序替换接口3.5 自定义shell 3. 进程程序替换 3.1 单进程版 – 看看程序替换 makefile mycommand:mycommand.cgcc -o $ $^ -stdc99 .PHONY:clean …...
在 Ubuntu 上安装 MySQL 的详细指南
在Ubuntu环境中安装 mysql-server 以及 MySQL 开发包(包括头文件和动态库文件),并处理最新版本MySQL初始自动生成的用户名和密码,可以通过官方的APT包管理器轻松完成。以下是详细的步骤指南,包括从官方仓库和MySQL官方…...
Hive: Hive的优缺点,使用方式,判断Hive是否启动(jps),元数据的存储,Hive和Hadoop的关系
hive 是一个构建在 Hadoop 上的数据仓库 工具 ( 框架 ) ,可以将结构化的数据文件映射成一张数据表,并可以使用类sql 的方式来对这样的数据文件进行读,写以及管理(包括元数据)。这套 HIVE SQL 简称 HQL。 hive 的执行引…...
Social LSTM:Human Trajectory Prediction in Crowded Spaces | 文献翻译
概要 行人遵循不同轨迹以避免障碍物和容纳同行者。任何在这种场景中巡航的自动驾驶车辆都需要能够遇见行人的未来位置并相应地调整其路线以避免碰撞。轨迹预测问题能够被看作一个顺序生成任务,其中我们对基于行人过去的位置预测其未来的轨迹感兴趣。根据最近RNN&am…...
前后端交互过程
一、前后端交互过程 前后端交互是指客户端(前端)与服务器(后端)之间的数据通信。以下是一个典型的前后端交互流程: 前端请求: 用户在浏览器上与前端界面交互,如点击按钮、提交表单。前端使用 A…...
【计算机视觉】人脸识别
一、简介 人脸识别是将图像或者视频帧中的人脸与数据库中的人脸进行对比,判断输入人脸是否与数据库中的某一张人脸匹配,即判断输入人脸是谁或者判断输入人脸是否是数据库中的某个人。 人脸识别属于1:N的比对,输入人脸身份是1&…...
Spark Streaming的核心功能及其示例PySpark代码
Spark Streaming是Apache Spark中用于实时流数据处理的模块。以下是一些常见功能的实用PySpark代码示例: 基础流处理:从TCP套接字读取数据并统计单词数量 from pyspark import SparkContext from pyspark.streaming import StreamingContext# 创建Spar…...
高效实现 Markdown 转 PDF 的跨平台指南20250117
高效实现 Markdown 转 PDF 的跨平台指南 引言 Markdown 文件以其轻量化和灵活性受到开发者和技术写作者的青睐,但如何将其转换为易于分享和打印的 PDF 格式,是一个常见需求。本文整合了 macOS、Windows 和 Linux 三大平台的转换方法,并探讨…...
冯诺依曼架构和哈佛架构的主要区别?
冯诺依曼架构(Von Neumann Architecture)和哈佛架构(Harvard Architecture)是两种计算机体系结构,它们在存储器组织、指令处理和数据存取等方面有明显的不同。以下是它们的主要区别: 1.存储器结构 冯诺依曼…...
AI 新动态:技术突破与应用拓展
目录 一.大语言模型的持续进化 二.AI 在医疗领域的深度应用 疾病诊断 药物研发 三.AI 与自动驾驶的新进展 四.AI 助力环境保护 应对气候变化 能源管理 后记 在当下科技迅猛发展的时代,人工智能(AI)无疑是最具影响力的领域之一。AI 技…...
Java锁 从乐观锁和悲观锁开始讲 面试复盘
目录 面试复盘 Java 中的锁 大全 悲观锁 专业解释 自我理解 乐观锁 专业解释 自我理解 悲观锁的调用 乐观锁的调用 synchronized和 ReentrantLock的区别 相同点 区别 详细对比 总结 面试复盘 Java 中的锁 大全 悲观锁 专业解释 适合写操作多的场景 先加锁可以…...
【RabbitMq】RabbitMq高级特性-延迟消息
延迟消息 什么是延迟消息死信交换机延迟消息插件-DelayExchange其他文章 什么是延迟消息 延迟消息:发送者发送消息时指定一个时间,消费者不会立刻收到消息,而是在指定时间之后才收到消息。 延迟任务:设置在一定时间之后才执行的任…...
MindAgent:基于大型语言模型的多智能体协作基础设施
2023-09-18 ,加州大学洛杉矶分校(UCLA)、微软研究院、斯坦福大学等机构共同创建的新型基础设施,目的在评估大型语言模型在游戏互动中的规划和协调能力。MindAgent通过CuisineWorld这一新的游戏场景和相关基准,调度多智…...
Linux内存管理(Linux内存架构,malloc,slab的实现)
文章目录 前言一、Linux进程空间内存分配二、malloc的实现机理三、物理内存与虚拟内存1.物理内存2.虚拟内存 四、磁盘和物理内存区别五、页页的基本概念:分页管理的核心概念:Linux 中分页的实现:总结: 六、伙伴算法伙伴算法的核心…...
【机器学习实战中阶】比特币价格预测
比特币价格预测项目介绍 比特币价格预测项目是一个非常有实用价值的机器学习项目。随着区块链技术的快速发展,越来越多的数字货币如雨后春笋般涌现,尤其是比特币作为最早的加密货币,其价格波动备受全球投资者和研究者的关注。本项目的目标是…...
【JVM-9】Java性能调优利器:jmap工具使用指南与应用案例
在Java应用程序的性能调优和故障排查中,jmap(Java Memory Map)是一个不可或缺的工具。它可以帮助开发者分析Java堆内存的使用情况,生成堆转储文件(Heap Dump),并查看内存中的对象分布。无论是内…...
使用vscode在本地和远程服务器端运行和调试Python程序的方法总结
1 官网下载 下载网址:https://code.visualstudio.com/Download 如下图所示,可以分别下载Windows,Linux,macOS版本 历史版本下载链接: https://code.visualstudio.com/updates 2 安装Python扩展工具 打开 VS Code,安装 Microsoft 提供的官…...
AI 编程工具—Cursor 对话模式详解 Chat、Composer 与 Normal/Agent 模式
Cursor AI 对话模式详解:Chat、Composer 与 Normal/Agent 模式 一、简介 Cursor 是一个强大的 AI 辅助编程工具,它提供了多种对话模式来满足不同的开发需求。主要包括: Chat 模式:直接对话交互Composer 模式:结构化编程助手Normal/Agent 模式:不同的 AI 响应策略打开Ch…...
【MySQL】数据库基础知识
欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】数据库基础知识 发布时间:2025.1.21 隶属专栏:MySQL 目录 什么是数据库为什么要有数据库数据库的概念 主流数据库mysql的安装mysql登录使用一下mysql显示数据库内容创建一个数据库创…...
ChatGPT开发教程指南
ChatGPT开发教程指南 一、ChatGPT 概述二、开发环境搭建(一)硬件要求(二)软件要求 三、开发流程(一)数据处理(二)模型选择与训练(三)接口开发 四、示例代码 随…...
OpenEuler学习笔记(四):OpenEuler与CentOS的区别在那里?
OpenEuler与CentOS的对比 一、基本信息 起源与背景: OpenEuler:由华为发起,后捐赠给开放原子开源基金会,旨在构建一个开放、多元化的云计算和边缘计算平台,以满足华为及其他企业的硬件和软件需求。CentOS:…...
spring cloud如何实现负载均衡
在Spring Cloud中,实际上并没有直接支持lb:\\这样的URL前缀来自动解析为负载均衡的服务地址。lb:\\这样的表示可能是在某些特定框架、文档或示例中自定义的,但它并不是Spring Cloud官方API或规范的一部分。 Spring Cloud实现负载均衡的方式通常依赖于服…...
LeetCode:37. 解数独
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:37. 解数独 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则ÿ…...
如何在idea中搭建SpringBoot项目
如何在idea中快速搭建SpringBoot项目 目录 如何在idea中快速搭建SpringBoot项目前言一、环境准备:搭建前的精心布局 1.下载jdk (1)安装JDK:(2)运行安装程序:(3)设置安装…...
STM32补充——FLASH
目录 1.内部FLASH构成(F1) 2.FLASH读写过程(F1) 2.1内存的读取 2.2闪存的写入 2.3FLASH接口寄存器(写入 & 擦除相关) 3.FLASH相关HAL库函数简介(F1/F4/F7/H7) 4.编程实战 …...
ASP.NET Core 中的 JWT 鉴权实现
在当今的软件开发中,安全性和用户认证是至关重要的方面。JSON Web Token(JWT)作为一种流行的身份验证机制,因其简洁性和无状态特性而被广泛应用于各种应用中,尤其是在 ASP.NET Core 项目里。本文将详细介绍如何在 ASP.…...
Docker配置国内镜像源
访问docker hub需要科学上网 在 Docker 中配置镜像地址(即镜像加速器)可以显著提升拉取镜像的速度,尤其是在国内访问 Docker Hub 时。以下是详细的配置方法: 1. 配置镜像加速器 Docker 支持通过修改配置文件来添加镜像加速器地址…...
qiankun+vite+vue3
基座与子应用代码示例 本示例中,基座为Vue3,子应用也是Vue3,由于qiankun不支持Vite构建的项目,这里还要引入 vite-plugin-qiankun 插件 基座(主应用) 加载qiankun依赖 npm i qiankun -S qiankun配置(src/qiankun) src/qiankun/config.ts export default {subApp…...
如何使用AI工具cursor(内置ChatGPT 4o+claude-3.5)
⚠️温馨提示: 禁止商业用途,请支持正版,充值使用,尊重知识产权! 免责声明: 1、本教程仅用于学习和研究使用,不得用于商业或非法行为。 2、请遵守Cursor的服务条款以及相关法律法规。 3、本…...
Linux内核编程(二十一)USB驱动开发-键盘驱动
一、驱动类型 USB 驱动开发主要分为两种:主机侧的驱动程序和设备侧的驱动程序。一般我们编写的都是主机侧的USB驱动程序。 主机侧驱动程序用于控制插入到主机中的 USB 设备,而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与…...
vue3+ts watch 整理
watch() 一共可以接受三个参数,侦听数据源、回调函数和配置选项 作用:监视数据的变化(和Vue2中的watch作用一致) 特点:Vue3中的watch只能监视以下四种数据: ref定义的数据。 reactive定义的数据。 函数返…...
2025年最新深度学习环境搭建:Win11+ cuDNN + CUDA + Pytorch +深度学习环境配置保姆级教程
本文目录 一、查看驱动版本1.1 查看显卡驱动1.2 显卡驱动和CUDA对应版本1.3 Pytorch和Python对应的版本1.4 Pytorch和CUDA对应的版本 二、安装CUDA三、安装cuDANN四、安装pytorch五、验证是否安装成功 一、查看驱动版本 1.1 查看显卡驱动 输入命令nvidia-smi可以查看对应的驱…...
USART_串口通讯轮询案例(HAL库实现)
引言 前面讲述的串口通讯案例是使用寄存器方式实现的,有利于深入理解串口通讯底层原理,但其开发效率较低;对此,我们这里再讲基于HAL库实现的串口通讯轮询案例,实现高效开发。当然,本次案例需求仍然和前面寄…...
CAN 网络介绍
背景 在T-Box 产品开发过程中,我们离不开CAN总线,因为CAN总线为我们提供了车身的相关数据,比如,车速、油耗、温度等。用于上报TSP平台,进行国标认证;也帮助我们进行车身控制,比如车门解锁/闭锁…...
pytorch 多机多卡训练方法
在深度学习训练中,使用多机多卡(多台机器和多块 GPU)可以显著加速模型训练过程。 PyTorch 提供了多种方法来实现多机多卡训练,以下是一些常用的方法和步骤: 1. 使用 torch.distributed 包 PyTorch 的 torch.distribut…...
【智能控制】年末总结,模糊控制,神经网络控制,专家控制,遗传算法
关注作者了解更多 我的其他CSDN专栏 毕业设计 求职面试 大学英语 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 …...
Linux系统 C/C++编程基础——使用make工具和Makefile实现自动编译
ℹ️大家好,我是练小杰,今天周二了,距离除夕只有6天了,新的一年就快到了😆 本文是有关Linux C/C编程的make和Makefile实现自动编译相关知识点,后续会不断添加相关内容 ~~ 回顾:【Emacs编辑器、G…...
kafka学习笔记7 性能测试 —— 筑梦之路
kafka 不同的参数配置对 kafka 性能都会造成影响,通常情况下集群性能受分区、磁盘和线程等影响因素,因此需要进行性能测试,找出集群性能瓶颈和最佳参数。 # 生产者和消费者的性能测试工具 kafka-producer-perf-test.sh kafka-consumer-perf-t…...
C#与AI的共同发展
C#与人工智能(AI)的共同发展反映了编程语言随着技术进步而演变,以适应新的挑战和需要。自2000年微软推出C#以来,这门语言经历了多次迭代,不仅成为了.NET平台的主要编程语言之一,还逐渐成为构建各种类型应用程序的强大工具。随着时…...
multus使用教程
操作步骤如下: 1.在vmware vsphere上配置所有主机使用的端口组安全项 Forged transmits 设置为: Accept Promiscuous Mode 设置为:Accept Promiscuous Mode(混杂模式)和Forged Transmits(伪传输)…...
用JAVA写算法之输入输出篇
本系列适合原来用C语言或其他语言写算法,但是因为找工作或比赛的原因改用JAVA语言写算法的同学。当然也同样适合初学算法,想用JAVA来写算法题的同学。 常规方法:使用Scanner类和System.out 这种方法适用于leetcode,以及一些面试手…...