【2024年华为OD机试】(C卷,100分)- 查找接口成功率最优时间段 (JavaScriptJava PythonC/C++)
一、问题描述
题目解析
题目描述
服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示。数组中每个元素都是单位时间内失败率数值,数组中的数值为 0~100 的整数。给定一个数值 minAverageLost
,表示某个时间段内平均失败率容忍值,即平均失败率小于等于 minAverageLost
。要求找出数组中最长时间段,如果未找到则直接返回 NULL
。
输入描述
- 输入有两行内容:
- 第一行为
minAverageLost
,表示平均失败率容忍值。 - 第二行为数组,数组元素通过空格分隔。
- 第一行为
minAverageLost
及数组中元素取值范围为 0~100 的整数。- 数组元素的个数不会超过 100 个。
输出描述
- 找出平均值小于等于
minAverageLost
的最长时间段,输出数组下标对,格式为{beginIndex}-{endIndex}
(下标从 0 开始)。 - 如果同时存在多个最长时间段,则输出多个下标对,且下标对之间使用空格拼接,多个下标对按下标从小到大排序。
用例
用例 1
输入:
1
0 1 2 3 4
输出:
0-2
说明:
- 输入解释:
minAverageLost = 1
,数组为[0, 1, 2, 3, 4]
。 - 前 3 个元素的平均值为 1,因此数组第一个至第三个数组下标,即
0-2
。
用例 2
输入:
2
0 0 100 2 2 99 0 2
输出:
0-1 3-4 6-7
说明:
- 输入解释:
minAverageLost = 2
,数组为[0, 0, 100, 2, 2, 99, 0, 2]
。 - 通过计算小于等于 2 的最长时间段为:
- 数组下标为
0-1
即[0, 0]
。 - 数组下标为
3-4
即[2, 2]
。 - 数组下标为
6-7
即[0, 2]
。
- 数组下标为
- 这三个部分都满足平均值小于等于 2 的要求,因此输出
0-1 3-4 6-7
。
题目解析
问题分析
本题的核心是找到数组中满足平均失败率小于等于 minAverageLost
的最长时间段。具体来说,需要遍历数组的所有可能区间,计算每个区间的平均值,并筛选出满足条件的最长区间。
解题思路
-
遍历所有区间:
- 使用双重循环遍历数组的所有可能区间。
- 外层循环确定区间的右边界
i
,内层循环确定区间的左边界j
。
-
计算区间平均值:
- 对于每个区间
[j, i]
,计算其平均值。 - 为了避免重复计算区间和,可以使用前缀和数组
dp
,其中dp[i]
表示数组前i
个元素的和。 - 区间
[j, i]
的和可以通过dp[i] - dp[j - 1]
快速计算。
- 对于每个区间
-
筛选满足条件的区间:
- 如果区间
[j, i]
的平均值小于等于minAverageLost
,则记录该区间的长度和下标。 - 如果存在多个相同长度的区间,则全部记录下来。
- 如果区间
-
输出结果:
- 将所有满足条件的最长区间按下标从小到大排序,并输出。
关键点
-
前缀和优化:
- 使用前缀和数组可以快速计算任意区间的和,避免重复计算。
-
区间遍历:
- 使用双重循环遍历所有可能的区间,确保不漏掉任何可能的区间。
-
平均值计算:
- 通过区间和除以区间长度计算平均值,并与
minAverageLost
比较。
- 通过区间和除以区间长度计算平均值,并与
-
结果排序:
- 如果存在多个相同长度的区间,需要按下标从小到大排序输出。
总结
本题的核心是通过遍历所有可能的区间,计算每个区间的平均值,并筛选出满足条件的最长区间。使用前缀和优化可以显著提高计算效率,确保在合理时间内完成计算。最终结果需要按区间下标的升序输出。
二、JavaScript算法源码
以下是代码的详细注释和讲解,帮助你理解每一部分的功能和实现逻辑:
代码结构
-
输入获取:
- 使用
readline
模块从控制台读取输入。 - 第一行输入为
minAverageLost
,表示平均失败率容忍值。 - 第二行输入为数组
nums
,表示单位时间内的失败率数值。
- 使用
-
前缀和计算:
- 使用前缀和数组
preSum
快速计算任意区间的和。
- 使用前缀和数组
-
区间遍历与筛选:
- 使用双重循环遍历所有可能的区间。
- 计算每个区间的和,并判断是否满足平均失败率小于等于
minAverageLost
的条件。 - 记录满足条件的最长区间。
-
结果输出:
- 如果没有满足条件的区间,输出
NULL
。 - 否则,输出所有满足条件的最长区间,按区间下标的升序排序。
- 如果没有满足条件的区间,输出
代码逐行注释
// 引入 readline 模块,用于从控制台读取输入
const rl = require("readline").createInterface({ input: process.stdin });// 创建异步迭代器,用于逐行读取输入
var iter = rl[Symbol.asyncIterator]();// 定义 readline 函数,用于读取一行输入
const readline = async () => (await iter.next()).value;// 使用立即执行函数表达式 (IIFE) 执行主逻辑
void (async function () {// 读取第一行输入,转换为整数 minAverageLostconst minAverageLost = parseInt(await readline());// 读取第二行输入,按空格分割成数组,并转换为数字const nums = (await readline()).split(" ").map(Number);// 获取数组的长度const n = nums.length;// 定义前缀和数组 preSum,长度为 n+1,初始值为 0const preSum = new Array(n + 1).fill(0);// 计算前缀和数组for (let i = 1; i <= n; i++) {preSum[i] = preSum[i - 1] + nums[i - 1];}// 定义结果数组 ans,用于存储满足条件的区间let ans = [];// 定义变量 maxLen,用于记录满足条件的最长区间的长度let maxLen = 0;// 使用双重循环遍历所有可能的区间for (let i = 0; i < n; i++) {for (let j = i + 1; j <= n; j++) {// 计算区间 [i, j-1] 的和let sum = preSum[j] - preSum[i];// 计算区间的长度let len = j - i;// 计算区间的容忍失败率总和let lost = len * minAverageLost;// 如果区间的和小于等于容忍失败率总和if (sum <= lost) {// 如果当前区间的长度大于等于 maxLenif (len >= maxLen) {// 如果当前区间的长度大于 maxLen,清空结果数组if (len > maxLen) {ans = [];}// 将当前区间加入结果数组ans.push([i, j - 1]);// 更新 maxLenmaxLen = len;}}}}// 如果没有满足条件的区间,输出 NULLif (ans.length == 0) {console.log("NULL");} else {// 否则,按区间下标的升序排序,并输出结果console.log(ans.sort((a, b) => a[0] - b[0]) // 按区间起始下标升序排序.map((arr) => arr.join("-")) // 将区间转换为字符串格式.join(" ") // 将多个区间用空格拼接);}
})();
代码逻辑详解
1. 输入获取
- 使用
readline
模块从控制台读取输入。 - 第一行输入为
minAverageLost
,表示平均失败率容忍值。 - 第二行输入为数组
nums
,表示单位时间内的失败率数值。
2. 前缀和计算
- 定义前缀和数组
preSum
,其中preSum[i]
表示数组前i
个元素的和。 - 通过遍历数组
nums
,计算前缀和数组preSum
。
3. 区间遍历与筛选
- 使用双重循环遍历所有可能的区间
[i, j-1]
。 - 对于每个区间,计算其和
sum
和长度len
。 - 计算区间的容忍失败率总和
lost = len * minAverageLost
。 - 如果
sum <= lost
,则说明该区间满足条件。 - 如果当前区间的长度大于等于
maxLen
,则更新结果数组ans
和maxLen
。
4. 结果输出
- 如果没有满足条件的区间,输出
NULL
。 - 否则,将结果数组
ans
按区间起始下标升序排序,并输出。
示例运行
输入 1
1
0 1 2 3 4
处理过程
- 计算前缀和数组
preSum = [0, 0, 1, 3, 6, 10]
。 - 遍历所有区间,找到满足条件的区间
[0, 2]
。 - 输出结果
0-2
。
输出 1
0-2
输入 2
2
0 0 100 2 2 99 0 2
处理过程
- 计算前缀和数组
preSum = [0, 0, 0, 100, 102, 104, 203, 203, 205]
。 - 遍历所有区间,找到满足条件的区间
[0, 1]
、[3, 4]
和[6, 7]
。 - 输出结果
0-1 3-4 6-7
。
输出 2
0-1 3-4 6-7
总结
- 代码通过前缀和优化快速计算任意区间的和。
- 使用双重循环遍历所有可能的区间,并筛选出满足条件的最长区间。
- 最终结果按区间下标的升序排序输出。
三、Java算法源码
以下是 Java 版本的代码实现,包含详细的中文注释和讲解。
Java 代码实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.StringJoiner;public class Main {public static void main(String[] args) {// 创建 Scanner 对象,用于读取控制台输入Scanner sc = new Scanner(System.in);// 读取第一行输入,转换为整数 minAverageLostint minAverageLost = Integer.parseInt(sc.nextLine());// 读取第二行输入,按空格分割成数组,并转换为整数数组 numsint[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();// 调用 getResult 函数,传入数组 nums 和 minAverageLost,输出结果System.out.println(getResult(nums, minAverageLost));}// 定义 getResult 函数,用于处理输入数组和 minAverageLostpublic static String getResult(int[] nums, int minAverageLost) {// 获取数组的长度int n = nums.length;// 定义前缀和数组 preSum,长度为 n+1int[] preSum = new int[n + 1];// 计算前缀和数组for (int i = 1; i <= n; i++) {preSum[i] = preSum[i - 1] + nums[i - 1];}// 定义结果列表 ans,用于存储满足条件的区间ArrayList<int[]> ans = new ArrayList<>();// 定义变量 maxLen,用于记录满足条件的最长区间的长度int maxLen = 0;// 使用双重循环遍历所有可能的区间for (int i = 0; i < n; i++) {for (int j = i + 1; j <= n; j++) {// 计算区间 [i, j-1] 的和int sum = preSum[j] - preSum[i];// 计算区间的长度int len = j - i;// 计算区间的容忍失败率总和int lost = len * minAverageLost;// 如果区间的和小于等于容忍失败率总和if (sum <= lost) {// 如果当前区间的长度大于等于 maxLenif (len >= maxLen) {// 如果当前区间的长度大于 maxLen,清空结果列表if (len > maxLen) {ans = new ArrayList<>();}// 将当前区间加入结果列表ans.add(new int[] {i, j - 1});// 更新 maxLenmaxLen = len;}}}}// 如果没有满足条件的区间,返回 "NULL"if (ans.size() == 0) return "NULL";// 对结果列表按区间起始下标升序排序ans.sort((a, b) -> a[0] - b[0]);// 使用 StringJoiner 将结果拼接成字符串StringJoiner sj = new StringJoiner(" ");for (int[] an : ans) sj.add(an[0] + "-" + an[1]);// 返回结果字符串return sj.toString();}
}
代码讲解
1. 输入获取
- 使用
Scanner
从控制台读取输入。 - 第一行输入为
minAverageLost
,表示平均失败率容忍值。 - 第二行输入为数组
nums
,表示单位时间内的失败率数值。
2. 前缀和计算
- 定义前缀和数组
preSum
,其中preSum[i]
表示数组前i
个元素的和。 - 通过遍历数组
nums
,计算前缀和数组preSum
。
3. 区间遍历与筛选
- 使用双重循环遍历所有可能的区间
[i, j-1]
。 - 对于每个区间,计算其和
sum
和长度len
。 - 计算区间的容忍失败率总和
lost = len * minAverageLost
。 - 如果
sum <= lost
,则说明该区间满足条件。 - 如果当前区间的长度大于等于
maxLen
,则更新结果列表ans
和maxLen
。
4. 结果输出
- 如果没有满足条件的区间,返回
"NULL"
。 - 否则,将结果列表
ans
按区间起始下标升序排序,并使用StringJoiner
拼接成字符串输出。
示例运行
输入 1
1
0 1 2 3 4
处理过程
- 计算前缀和数组
preSum = [0, 0, 1, 3, 6, 10]
。 - 遍历所有区间,找到满足条件的区间
[0, 2]
。 - 输出结果
0-2
。
输出 1
0-2
输入 2
2
0 0 100 2 2 99 0 2
处理过程
- 计算前缀和数组
preSum = [0, 0, 0, 100, 102, 104, 203, 203, 205]
。 - 遍历所有区间,找到满足条件的区间
[0, 1]
、[3, 4]
和[6, 7]
。 - 输出结果
0-1 3-4 6-7
。
输出 2
0-1 3-4 6-7
总结
- 代码通过前缀和优化快速计算任意区间的和。
- 使用双重循环遍历所有可能的区间,并筛选出满足条件的最长区间。
- 最终结果按区间下标的升序排序输出。
四、Python算法源码
以下是 Python 版本的代码实现,包含详细的中文注释和讲解。
Python 代码实现
# 输入获取
minAverageLost = int(input()) # 读取第一行输入,转换为整数 minAverageLost
nums = list(map(int, input().split())) # 读取第二行输入,按空格分割成数组,并转换为整数列表 nums# 算法入口
def getResult():# 获取数组的长度n = len(nums)# 定义前缀和数组 preSum,长度为 n+1preSum = [0] * (n + 1)# 计算前缀和数组for i in range(1, n + 1):preSum[i] = preSum[i - 1] + nums[i - 1]# 定义结果列表 ans,用于存储满足条件的区间ans = []# 定义变量 maxLen,用于记录满足条件的最长区间的长度maxLen = 0# 使用双重循环遍历所有可能的区间for i in range(n):for j in range(i + 1, n + 1):# 计算区间 [i, j-1] 的和sumV = preSum[j] - preSum[i]# 计算区间的长度length = j - i# 计算区间的容忍失败率总和lost = length * minAverageLost# 如果区间的和小于等于容忍失败率总和if sumV <= lost:# 如果当前区间的长度大于 maxLenif length > maxLen:# 清空结果列表,并更新 maxLenans = [[i, j - 1]]maxLen = length# 如果当前区间的长度等于 maxLenelif length == maxLen:# 将当前区间加入结果列表ans.append([i, j - 1])# 对结果列表按区间起始下标升序排序ans.sort(key=lambda x: x[0])# 如果没有满足条件的区间,返回 "NULL"if len(ans) == 0:return "NULL"else:# 将结果列表中的区间转换为字符串格式,并用空格拼接return " ".join(map(lambda x: "-".join(map(str, x)), ans))# 调用算法并输出结果
print(getResult())
代码讲解
1. 输入获取
- 使用
input()
从控制台读取输入。 - 第一行输入为
minAverageLost
,表示平均失败率容忍值。 - 第二行输入为数组
nums
,表示单位时间内的失败率数值。
2. 前缀和计算
- 定义前缀和数组
preSum
,其中preSum[i]
表示数组前i
个元素的和。 - 通过遍历数组
nums
,计算前缀和数组preSum
。
3. 区间遍历与筛选
- 使用双重循环遍历所有可能的区间
[i, j-1]
。 - 对于每个区间,计算其和
sumV
和长度length
。 - 计算区间的容忍失败率总和
lost = length * minAverageLost
。 - 如果
sumV <= lost
,则说明该区间满足条件。 - 如果当前区间的长度大于
maxLen
,则清空结果列表ans
并更新maxLen
。 - 如果当前区间的长度等于
maxLen
,则将当前区间加入结果列表ans
。
4. 结果输出
- 如果没有满足条件的区间,返回
"NULL"
。 - 否则,将结果列表
ans
按区间起始下标升序排序,并转换为字符串格式输出。
示例运行
输入 1
1
0 1 2 3 4
处理过程
- 计算前缀和数组
preSum = [0, 0, 1, 3, 6, 10]
。 - 遍历所有区间,找到满足条件的区间
[0, 2]
。 - 输出结果
0-2
。
输出 1
0-2
输入 2
2
0 0 100 2 2 99 0 2
处理过程
- 计算前缀和数组
preSum = [0, 0, 0, 100, 102, 104, 203, 203, 205]
。 - 遍历所有区间,找到满足条件的区间
[0, 1]
、[3, 4]
和[6, 7]
。 - 输出结果
0-1 3-4 6-7
。
输出 2
0-1 3-4 6-7
总结
- 代码通过前缀和优化快速计算任意区间的和。
- 使用双重循环遍历所有可能的区间,并筛选出满足条件的最长区间。
- 最终结果按区间下标的升序排序输出。
五、C/C++算法源码:
C语言代码及详细注释
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_SIZE 100// 比较函数,用于qsort排序
int cmp(const void *a, const void *b) {int *A = (int *) a;int *B = (int *) b;return A[0] - B[0]; // 按照区间的起始位置进行升序排序
}int main() {int minAverageLost; // 最小平均损失值scanf("%d", &minAverageLost); // 输入最小平均损失值int nums[MAX_SIZE]; // 存储输入的数组int nums_size = 0; // 数组的实际大小// 循环读取输入的数字,直到遇到非空格字符结束while (scanf("%d", &nums[nums_size++])) {if (getchar() != ' ') break;}// 计算前缀和数组,preSum[i]表示nums[0]到nums[i-1]的和int preSum[nums_size + 1];preSum[0] = 0; // 前缀和数组的第一个元素初始化为0for (int i = 1; i <= nums_size; i++) {preSum[i] = preSum[i - 1] + nums[i - 1];}int arrList[MAX_SIZE][2]; // 存储符合条件的区间int arrList_size = 0; // 符合条件的区间数量int maxLen = 0; // 记录最长的区间长度// 遍历所有可能的区间for (int i = 0; i < nums_size; i++) {for (int j = i + 1; j <= nums_size; j++) {// sum 是区间 [i, j-1] 的和int sum = preSum[j] - preSum[i];int len = j - i; // 区间长度int lost = len * minAverageLost; // 区间的最小损失值// 如果区间的和小于等于最小损失值,则符合条件if (sum <= lost) {if (len >= maxLen) {// 如果当前区间长度大于最大长度,则清空之前的记录if (len > maxLen) {arrList_size = 0;}// 记录当前区间的起始和结束位置arrList[arrList_size][0] = i;arrList[arrList_size][1] = j - 1;arrList_size++;maxLen = len; // 更新最大长度}}}}// 如果没有符合条件的区间,输出NULLif (arrList_size == 0) {puts("NULL");} else {// 对符合条件的区间按照起始位置进行排序qsort(arrList, arrList_size, sizeof(int *), cmp);// 将结果格式化为字符串char res[10000];for (int i = 0; i < arrList_size; i++) {char tmp[100];sprintf(tmp, "%d-%d", arrList[i][0], arrList[i][1]);strcat(res, tmp);strcat(res, " ");}// 去掉最后一个空格res[strlen(res) - 1] = '\0';// 输出结果puts(res);}return 0;
}
C++代码及详细注释
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>using namespace std;#define MAX_SIZE 100// 比较函数,用于sort排序
bool cmp(const vector<int>& a, const vector<int>& b) {return a[0] < b[0]; // 按照区间的起始位置进行升序排序
}int main() {int minAverageLost; // 最小平均损失值cin >> minAverageLost; // 输入最小平均损失值vector<int> nums; // 存储输入的数组int num;// 循环读取输入的数字,直到遇到换行符结束while (cin >> num) {nums.push_back(num);if (cin.get() != ' ') break;}// 计算前缀和数组,preSum[i]表示nums[0]到nums[i-1]的和vector<int> preSum(nums.size() + 1, 0);for (int i = 1; i <= nums.size(); i++) {preSum[i] = preSum[i - 1] + nums[i - 1];}vector<vector<int>> arrList; // 存储符合条件的区间int maxLen = 0; // 记录最长的区间长度// 遍历所有可能的区间for (int i = 0; i < nums.size(); i++) {for (int j = i + 1; j <= nums.size(); j++) {// sum 是区间 [i, j-1] 的和int sum = preSum[j] - preSum[i];int len = j - i; // 区间长度int lost = len * minAverageLost; // 区间的最小损失值// 如果区间的和小于等于最小损失值,则符合条件if (sum <= lost) {if (len >= maxLen) {// 如果当前区间长度大于最大长度,则清空之前的记录if (len > maxLen) {arrList.clear();}// 记录当前区间的起始和结束位置arrList.push_back({i, j - 1});maxLen = len; // 更新最大长度}}}}// 如果没有符合条件的区间,输出NULLif (arrList.empty()) {cout << "NULL" << endl;} else {// 对符合条件的区间按照起始位置进行排序sort(arrList.begin(), arrList.end(), cmp);// 将结果格式化为字符串string res;for (const auto& interval : arrList) {res += to_string(interval[0]) + "-" + to_string(interval[1]) + " ";}// 去掉最后一个空格res.pop_back();// 输出结果cout << res << endl;}return 0;
}
代码讲解
-
输入处理:
- 首先读取最小平均损失值
minAverageLost
。 - 然后读取一组整数,存储在数组
nums
中。
- 首先读取最小平均损失值
-
前缀和计算:
- 计算前缀和数组
preSum
,其中preSum[i]
表示nums[0]
到nums[i-1]
的和。
- 计算前缀和数组
-
区间遍历:
- 使用双重循环遍历所有可能的区间
[i, j-1]
,计算每个区间的和sum
和长度len
。 - 如果
sum
小于等于len * minAverageLost
,则说明该区间符合条件。
- 使用双重循环遍历所有可能的区间
-
记录符合条件的区间:
- 如果当前区间的长度大于之前记录的最大长度,则清空之前的记录,并记录当前区间。
- 如果当前区间的长度等于最大长度,则直接记录当前区间。
-
结果输出:
- 如果没有符合条件的区间,输出
NULL
。 - 否则,对符合条件的区间按照起始位置进行排序,并格式化输出。
- 如果没有符合条件的区间,输出
代码改进点
- C++代码:使用了
vector
代替C语言中的数组,更加灵活和安全。 - 输入处理:C++代码使用了
cin
和vector
来动态读取输入,避免了C语言中固定大小的数组限制。 - 排序:C++代码使用了
sort
函数,比C语言中的qsort
更加简洁和易用。
总结
这段代码的主要功能是找到所有满足条件的区间,并输出最长的区间。C语言和C++的实现思路基本相同,但在数据结构和输入输出处理上有所不同。C++代码更加现代化和易读,适合在C++项目中使用。
六、尾言
什么是华为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机试】(C卷,100分)- 查找接口成功率最优时间段 (JavaScriptJava PythonC/C++)
一、问题描述 题目解析 题目描述 服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示。数组中每个元素都是单位时间内失败率数值,数组中的数值为 0~100 的整数。给定一个数值 minAverageLost,表…...
Linux进度条实现
Linux进度条实现 1.\r\n2.缓冲区3.缓冲区分类4.进度条实现 🌟🌟hello,各位读者大大们你们好呀🌟🌟 🚀🚀系列专栏:【Linux的学习】 📝📝本篇内容:\…...
Java如何实现反转义
Java如何实现反转义 前提 最近做的一个需求,是热搜词增加换一批的功能。功能做完自测后,交给了测试伙伴,但是测试第二天后就提了一个bug,出现了未知词 levis。第一眼看着像公司售卖的一个品牌-李维斯。然后再扒前人写的代码&…...
计算机网络 (57)改进“尽最大努力交付”的服务
前言 计算机网络中的“尽最大努力交付”服务是网络层的一种数据传输方式。这种服务的特点是网络层只负责尽力将数据报从源端传输到目的端,而不保证数据传输的可靠性。 一、标记与分类 为数据分组打上标记: 给不同性质的分组打上不同的标记&#x…...
Java 基于 SpringBoot 的校园外卖点餐平台微信小程序(附源码,部署,文档)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
重构(4)
(一)添加解释性变量,使得代码更容易理解,更容易调试,也可以方便功能复用 解释性的变量 总价格为商品总价(单价*数量)-折扣(超过100个以上的打9折)邮费(原价的…...
【Arduino】语言参考功能
前言 翻译Arduino 参考处列出的常用函数。文中为了减少篇幅,达到能快速翻到查询的目标,在介绍函数中,对部分内容进行了省略,不会列出函数输入参数类型,以及使用注意事项等等,所以若是首次使用或者是调试时出…...
CMake使用CPack制作安装程序
CPack的功能很强大,笔者前面有一博文使用CMake的CPack工具打包项目介绍了一下使用CPack来打包成7z压缩文件,不仅如此,它还可以生成各平台的安装包。 CPack支持以下类型的生成器: 名称文件类型平台及说明STGZSTGZ(.sh)自解压文件…...
Flink运行时架构
一、系统架构 1)作业管理器(JobManager) JobManager是一个Flink集群中任务管理和调度的核心,是控制应用执行的主进程。也就是说,每个应用都应该被唯一的JobManager所控制执行。 JobManger又包含3个不同的组件。 &am…...
平衡二叉树(力扣110)
所谓平衡二叉树,就是每一个节点的左右子树的高度差不大于1。而一个子树的高度,就是父节点的最大高度。这道题的思路其实和二叉树的最大深度(力扣104)-CSDN博客有很大的相似之处,都需要将左右子树的高度返回给父节点,因此也是采用后…...
【玩转全栈】---基于YOLO8的图片、视频目标检测
本篇主要讲YOLO8的具体操作,想要了解YOLO的具体原理,可以去官网查询 目录 下载ultralytics库 开始检测 介绍 YOLOv8(You Only Look Once Version 8)是 YOLO 系列的最新版本,由 Ultralytics 开发并发布,是一…...
ES6+新特性,var、let 和 const 的区别
在 JavaScript 中,var、let 和 const 都用于声明变量,但它们有一些重要的区别,主要体现在 作用域、可变性和提升机制 等方面。 1. 作用域(Scope) var: var 声明的变量是 函数作用域,也就是说,它…...
汇编实验·分支程序设计
一、实验目的: 1.能够熟练的进行分支程序的编写,掌握条件语句对应的汇编语言指令的实现 2.掌握多个条件的分支语句的实现原理,理解C语言中的逻辑运算“短路”特征 二、实验内容 1.对2和3任务中的C代码在VS2022中运行,设置生成对应的汇编代码,观察生成代码的不同,着重…...
激光线扫相机无2D图像的标定方案
方案一:基于运动控制平台的标定 适用场景:若激光线扫相机安装在可控运动平台(如机械臂、平移台、旋转台)上,且平台的运动精度已知(例如通过编码器或高精度步进电机控制)。 步骤: 标…...
【Python・机器学习】多元回归模型(原理及代码)
前言 自学笔记,分享给语言学/语言教育学方向的,但对语言数据处理感兴趣但是尚未入门,却需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文最少限度涉及公式讲解(文科生小白友好体质)&am…...
ubuntu20.04安装使用direct_visual_lidar_calibration标定雷达和相机
官方链接GitHub - koide3/direct_visual_lidar_calibration: A toolbox for target-less LiDAR-camera calibration [ROS1/ROS2] 官方安装方式 Installation - direct_visual_lidar_calibration 安装依赖 sudo apt install libomp-dev libboost-all-dev libglm-dev libglfw…...
Android 自定义View时四个构造函数使用详解
该文章我们以自定义View继承TextView为例来讲解 创建自定义View命名MyTextView,并使其继承TextView 1、自定义View时第一个构造函数 // 第一个构造函数主要是在Java代码中声明一个MyTextView时所用 // 类似这种(MyTextView myTextViewnew MyTextView(this);) // 不…...
linux中关闭服务的开机自启动
引言 systemctl 是 Linux 系统中用于管理 systemd 服务的命令行工具。它可以用来启动、停止、重启服务,管理服务的开机自启动,以及查看服务的状态等。 什么是 systemd? systemd 是现代 Linux 发行版中默认的 初始化系统(init sys…...
【go语言】go的卸载与安装
一、卸载go sudo rm -rf /usr/local/go sudo apt-get remove golang sudo apt-get remove golang-go sudo apt-get autoremove wget https://dl.google.com/go/go1.19.linux-amd64.tar.gz sudo tar -xzf go1.19.linux-amd64.tar.gz -C /usr/local go env -w GOPROXY"http…...
微软Win10 RP 19045.5435(KB5050081)预览版发布!
系统之家1月20日最新报道,微软面向Release Preview频道的Windows Insider项目成员,发布了适用于Windows10 22H2版本的KB5050081更新,更新后系统版本号将升至19045.5435。本次更新增加了对GB18030-2022标准的支持,同时新版日历将为…...
VUE elTree 无子级 隐藏展开图标
这4个并没有下级节点,即它并不是叶子节点,就不需求展示前面的三角展开图标! 查阅官方文档如下描述,支持bool和函数回调处理,这里咱们选择更灵活的函数回调实现。 给el-tree结构配置一下props,注意! :pr…...
python实现代理服务器转换
使用 http.server 模块和 requests 库来实现,代理服务器可拦截匹配指定路径的 HTTP 请求,并打印或存储请求头和响应体。 实现目标: 1、创建一个HTTP代理服务器。 2、代理所有流量,而对指定的接口(如 /api/target&#…...
计算机网络三张表(ARP表、MAC表、路由表)总结
参考: 网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!_mac表、arp表、路由表-CSDN博客 网络中的三张表:ARP表、MAC表、路由表 首先要明确一件事,如果一个主机要发送数据,那么必…...
Dangerzone:免费的危险的文件转换安全程序
我们知道很多杀毒软件会将很多文件视作恶意程序,尤其是带宏病毒的DOC文件,直接删除难免会带来不必要的麻烦,那么推荐一款免费的危险的文件转换安全程序:Dangerzone 。它可以检查各种可能有危险的文件并将其转换为安全版本…...
2025/1/21 学习Vue的第四天
睡觉。 --------------------------------------------------------------------------------------------------------------------------------- 11.Object.defineProperty 1.在我们之前学习JS的时候,普通得定义一个对象与属性。 <!DOCTYPE html> <h…...
【IEEE Fellow 主讲报告| EI检索稳定】第五届机器学习与智能系统工程国际学术会议(MLISE 2025)
重要信息 会议时间地点:2025年6月13-15日 中国深圳 会议官网:http://mlise.org EI Compendex/Scopus稳定检索 会议简介 第五届机器学习与智能系统工程国际学术会议将于6月13-15日在中国深圳隆重召开。本次会议旨在搭建一个顶尖的学术交流平台…...
如何使用虚拟现实技术有效提升模拟训练效率
虚拟现实(VR)技术在模拟训练中的应用正逐步展现其巨大的潜力,通过提供高度沉浸式的体验、灵活的训练场景和精准的数据分析,显著提升训练效率。本文将结合Varjo XR-4头显、Techviz多通道显示软件、Senseglove虚拟现实手套等具体案例…...
OpenEuler学习笔记(十一):OpenEuler上搭建LAMP环境
LAMP环境指的是Linux、Apache、MySQL(或MariaDB)和PHP的组合,下面为你介绍在OpenEuler上搭建LAMP环境的详细步骤: 1. 系统更新 首先要更新系统中的软件包,保证系统处于最新状态。 sudo dnf update -y2. 安装Apache…...
Anaconda安装(2024最新版)
安装新的anaconda需要卸载干净上一个版本的anaconda,不然可能会在新版本安装过程或者后续使用过程中出错,完全卸载干净anaconda的方法,可以参考我的博客! 第一步:下载anaconda安装包 官网:Anaconda | The O…...
【玩转全栈】----YOLO8训练自己的模型并应用
继上篇: 【玩转全栈】---基于YOLO8的图片、视频目标检测-CSDN博客 相信大家已经可以训练一些图片和视频了,接下来我将为大家介绍如何训练自己的特定模型,并用其进行检测 目录 准备数据 图片数据 标识数据 配置文件 运行 测试训练结果 存在的问…...
计算机视觉算法实战——无人机检测
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 引言✨✨ 随着无人机技术的快速发展,无人机在农业、物流、监控等领域的应用越来越广泛。然而,无人机的滥用也带…...
css粘性定位超出指定宽度失效问题
展示效果 解决办法:外层容器添加display:grid即可 完整代码 <template><div class"box"><div class"line" v-for"items in 10"><div class"item" v-for"item in 8">drgg</div>&…...
⽤vector数组实现树的存储(孩⼦表示法)c++
在我们遇到的算法题中, ⼀般给出的树结构都是有编号的,这样会简化我们之后存储树的操作 ,⼀般提供两个信息; 结点的个数 n;n-1条x结点与y结点相连的边 题⽬描述: ⼀共9个结点셈 1号结点为根节点,接下来8⾏ÿ…...
高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?
如果有遗漏,评论区告诉我进行补充 面试官: 主键与索引有什么区别 ? 我回答: 一、主键(Primary Key) 1. 定义 主键是关系型数据库中的一条记录中的某个属性组(可以是一个字段或多个字段的组合),用于唯一标识一条记…...
spring aop 中 返回值
使用环绕切面 Around(value "requsetInterceptor()")public Object logExectionTime(ProceedingJoinPoint joinPoint) throws Throwable {logger.info("-------logExectionTime--------");if(isRun){Object proceed joinPoint.proceed(); // 执行目标方…...
总结7。。
二叉树的遍历是指按某条搜索路径访问树中的每个结点,使得每个结点均被访问一次,而且仅能访问一次(说明不可二次访问,一遍而过)。遍历一颗二叉树便要决定对根结点N、左子树L和右子树的访问顺序。 二叉树常的的遍历方法有…...
9.中断系统、EXTI外部中断
中断系统原理 中断 中断系统是管理和执行中断的逻辑结构,外部中断是众多能产生中断的外设之一,所以本节我们就借助外部中断来学习一下中断系统。在以后学习其它外设的时候,也是会经常和中断打交道的。 中断:在主程序运行过程中…...
【软件测试项目实战 】淘宝网:商品购买功能测试
一、用例设计方法分析 在对淘宝网商品下单功能进行测试时,不同的测试角度和场景适合运用不同的用例设计方法,以下是针对该功能各方面测试所适用方法及其原因的分析: 商品数量相关测试:对于商品数量的测试,主要采用等…...
TangoFlux 本地部署实用教程:开启无限音频创意脑洞
一、介绍 TangoFlux是通过流匹配和 Clap-Ranked 首选项优化,实现超快速、忠实的文本到音频生成的模型。 本模型由 Stability AI 提供支持🚀 TangoFlux 可以在单个 A40 GPU 上在 ~3 秒内生成长达 34.1kHz 的立体声音频。 二、部署 安装方式非常简单 1…...
Android多语言开发自动化生成工具
在做 Android 开发的过程中,经常会遇到多语言开发的场景,尤其在车载项目中,多语言开发更为常见。对应多语言开发,通常都是在中文版本的基础上开发其他国家语言,这里我们会拿到中-外语言对照表,这里的工作难…...
Mac cursor设置jdk、Maven版本
基本配置 – Cursor 使用文档 首先是系统用户级别的设置参数,运行cursor,按下ctrlshiftp,输入Open User Settings(JSON),在弹出的下拉菜单中选中下面这样的: 在打开的json编辑器中追加下面的内容: {"…...
Unity中在UI上画线
在UI中画一条曲线 我封装了一个组件,可以实现基本的画线需求. 效果 按住鼠标左键随手一画. 用起来也很简单,将组件挂到空物体上就行了,红色的背景是Panel. 你可以将该组件理解为一个Image,只不过形状更灵活一些罢了,所以它要放在下面的层级(不然可能会被挡住). 代码 可以…...
Unity中关于实现 管道水流+瀑布流动+大肠蠕动效果笔记
Unity中关于实现 管道水流瀑布流动大肠蠕动效果笔记 效果展示: 参考资料及链接: 1、如何在 Unity 中创建水效果 - 水弯曲教程 https://www.youtube.com/watch?v3CcWus6d_B8 关于补充个人技能中:顶点噪波影响网格着色器配合粒子实现水特效 …...
【ARTS】【LeetCode-704】二分查找算法
目录 前言 什么是ARTS? 算法 力扣704题 二分查找 基本思想: 二分查找算法(递归的方式): 经典写法(找单值): 代码分析: 经典写法(找数组即多个返回值) 代码分析 经典题目 题目描述: 官方题解 深入思考 模版一 (相错终止/左闭右闭) 相等返回情形…...
JavaWeb 学习笔记 XML 和 Json 篇 | 020
今日推荐语 愿你遇见好天气,愿你的征途铺满了星星——圣埃克苏佩里 日期 学习内容 打卡编号2025年01月23日JavaWeb笔记 XML 和 Json 篇020 前言 哈喽,我是菜鸟阿康。 以下是我的学习笔记,既做打卡也做分享,希望对你也有所帮助…...
【LeetCode】--- MySQL刷题集合
1.组合两个表(外连接) select p.firstName,p.lastName,a.city,a.state from Person p left join Address a on p.personId a.personId; 以左边表为基准,去连接右边的表。取两表的交集和左表的全集 2.第二高的薪水 (子查询、if…...
【深度解析Java 20天速成】04_IDEA的安装与使用
【Why IDEA ?】 【注】JetBrains官方说明: 尽管我们采取了多种措施确保受访者的代表性,但结果可能会略微偏向 JetBrains 产品的用户,因为这些用户更有可能参加调查。 此外,2022年,某美国软件开发商在对近千名专业的Ja…...
系统思考—业务协同
最近在和一些客户的沟通中,企业老板都提到一个共同的困惑:每个部门都感觉自己在解决问题,做了正确的事情,但为什么组织的绩效就是没有增长?更糟糕的是,大家都不知道问题到底出在哪里? 在这种情…...
windows安装ES
1. 下载ES 访问ES官网下载Download Elasticsearch | Elastic 2. 配置环境变量 ES_JAVA_HOME : D:\jdk-17.0.9 ES_HOME : D:\elasticsearch-8.17.1-windows-x86_64\elasticsearch-8.17.1 3. 添加一些ES的配置 <1>关闭ES安全认证 打开elasticsearch-8.17.1\config\e…...
[java] java基础-字符串篇
目录 API String 创建字符串对象的两种方式: Java的内存模型 字符串常量池(串池)存放地址 两种构造方法的内存分析 String的常用方法 号比较的是什么 字符串比较(比较字符串的数据值) 遍历字符串 StringBui…...