当前位置: 首页 > news >正文

【2024年华为OD机试】(C卷,100分)- 查找接口成功率最优时间段 (JavaScriptJava PythonC/C++)

在这里插入图片描述

一、问题描述

题目解析

题目描述

服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示。数组中每个元素都是单位时间内失败率数值,数组中的数值为 0~100 的整数。给定一个数值 minAverageLost,表示某个时间段内平均失败率容忍值,即平均失败率小于等于 minAverageLost。要求找出数组中最长时间段,如果未找到则直接返回 NULL


输入描述

  • 输入有两行内容:
    1. 第一行为 minAverageLost,表示平均失败率容忍值。
    2. 第二行为数组,数组元素通过空格分隔。
  • 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 的最长时间段。具体来说,需要遍历数组的所有可能区间,计算每个区间的平均值,并筛选出满足条件的最长区间。

解题思路
  1. 遍历所有区间

    • 使用双重循环遍历数组的所有可能区间。
    • 外层循环确定区间的右边界 i,内层循环确定区间的左边界 j
  2. 计算区间平均值

    • 对于每个区间 [j, i],计算其平均值。
    • 为了避免重复计算区间和,可以使用前缀和数组 dp,其中 dp[i] 表示数组前 i 个元素的和。
    • 区间 [j, i] 的和可以通过 dp[i] - dp[j - 1] 快速计算。
  3. 筛选满足条件的区间

    • 如果区间 [j, i] 的平均值小于等于 minAverageLost,则记录该区间的长度和下标。
    • 如果存在多个相同长度的区间,则全部记录下来。
  4. 输出结果

    • 将所有满足条件的最长区间按下标从小到大排序,并输出。

关键点

  1. 前缀和优化

    • 使用前缀和数组可以快速计算任意区间的和,避免重复计算。
  2. 区间遍历

    • 使用双重循环遍历所有可能的区间,确保不漏掉任何可能的区间。
  3. 平均值计算

    • 通过区间和除以区间长度计算平均值,并与 minAverageLost 比较。
  4. 结果排序

    • 如果存在多个相同长度的区间,需要按下标从小到大排序输出。

总结

本题的核心是通过遍历所有可能的区间,计算每个区间的平均值,并筛选出满足条件的最长区间。使用前缀和优化可以显著提高计算效率,确保在合理时间内完成计算。最终结果需要按区间下标的升序输出。

二、JavaScript算法源码

以下是代码的详细注释和讲解,帮助你理解每一部分的功能和实现逻辑:


代码结构

  1. 输入获取

    • 使用 readline 模块从控制台读取输入。
    • 第一行输入为 minAverageLost,表示平均失败率容忍值。
    • 第二行输入为数组 nums,表示单位时间内的失败率数值。
  2. 前缀和计算

    • 使用前缀和数组 preSum 快速计算任意区间的和。
  3. 区间遍历与筛选

    • 使用双重循环遍历所有可能的区间。
    • 计算每个区间的和,并判断是否满足平均失败率小于等于 minAverageLost 的条件。
    • 记录满足条件的最长区间。
  4. 结果输出

    • 如果没有满足条件的区间,输出 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,则更新结果数组 ansmaxLen
4. 结果输出
  • 如果没有满足条件的区间,输出 NULL
  • 否则,将结果数组 ans 按区间起始下标升序排序,并输出。

示例运行

输入 1
1
0 1 2 3 4
处理过程
  1. 计算前缀和数组 preSum = [0, 0, 1, 3, 6, 10]
  2. 遍历所有区间,找到满足条件的区间 [0, 2]
  3. 输出结果 0-2
输出 1
0-2

输入 2
2
0 0 100 2 2 99 0 2
处理过程
  1. 计算前缀和数组 preSum = [0, 0, 0, 100, 102, 104, 203, 203, 205]
  2. 遍历所有区间,找到满足条件的区间 [0, 1][3, 4][6, 7]
  3. 输出结果 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,则更新结果列表 ansmaxLen
4. 结果输出
  • 如果没有满足条件的区间,返回 "NULL"
  • 否则,将结果列表 ans 按区间起始下标升序排序,并使用 StringJoiner 拼接成字符串输出。

示例运行

输入 1
1
0 1 2 3 4
处理过程
  1. 计算前缀和数组 preSum = [0, 0, 1, 3, 6, 10]
  2. 遍历所有区间,找到满足条件的区间 [0, 2]
  3. 输出结果 0-2
输出 1
0-2

输入 2
2
0 0 100 2 2 99 0 2
处理过程
  1. 计算前缀和数组 preSum = [0, 0, 0, 100, 102, 104, 203, 203, 205]
  2. 遍历所有区间,找到满足条件的区间 [0, 1][3, 4][6, 7]
  3. 输出结果 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
处理过程
  1. 计算前缀和数组 preSum = [0, 0, 1, 3, 6, 10]
  2. 遍历所有区间,找到满足条件的区间 [0, 2]
  3. 输出结果 0-2
输出 1
0-2

输入 2
2
0 0 100 2 2 99 0 2
处理过程
  1. 计算前缀和数组 preSum = [0, 0, 0, 100, 102, 104, 203, 203, 205]
  2. 遍历所有区间,找到满足条件的区间 [0, 1][3, 4][6, 7]
  3. 输出结果 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;
}

代码讲解

  1. 输入处理

    • 首先读取最小平均损失值 minAverageLost
    • 然后读取一组整数,存储在数组 nums 中。
  2. 前缀和计算

    • 计算前缀和数组 preSum,其中 preSum[i] 表示 nums[0]nums[i-1] 的和。
  3. 区间遍历

    • 使用双重循环遍历所有可能的区间 [i, j-1],计算每个区间的和 sum 和长度 len
    • 如果 sum 小于等于 len * minAverageLost,则说明该区间符合条件。
  4. 记录符合条件的区间

    • 如果当前区间的长度大于之前记录的最大长度,则清空之前的记录,并记录当前区间。
    • 如果当前区间的长度等于最大长度,则直接记录当前区间。
  5. 结果输出

    • 如果没有符合条件的区间,输出 NULL
    • 否则,对符合条件的区间按照起始位置进行排序,并格式化输出。

代码改进点

  • C++代码:使用了 vector 代替C语言中的数组,更加灵活和安全。
  • 输入处理:C++代码使用了 cinvector 来动态读取输入,避免了C语言中固定大小的数组限制。
  • 排序:C++代码使用了 sort 函数,比C语言中的 qsort 更加简洁和易用。

总结

这段代码的主要功能是找到所有满足条件的区间,并输出最长的区间。C语言和C++的实现思路基本相同,但在数据结构和输入输出处理上有所不同。C++代码更加现代化和易读,适合在C++项目中使用。

六、尾言

什么是华为OD?

华为OD(Outsourcing Developer,外包开发工程师)是华为针对软件开发工程师岗位的一种招聘形式,主要包括笔试、技术面试以及综合面试等环节。尤其在笔试部分,算法题的机试至关重要。

为什么刷题很重要?

  1. 机试是进入技术面的第一关:
    华为OD机试(常被称为机考)主要考察算法和编程能力。只有通过机试,才能进入后续的技术面试环节。

  2. 技术面试需要手撕代码:
    技术一面和二面通常会涉及现场编写代码或算法题。面试官会注重考察候选人的思路清晰度、代码规范性以及解决问题的能力。因此提前刷题、多练习是通过面试的重要保障。

  3. 入职后的可信考试:
    入职华为后,还需要通过“可信考试”。可信考试分为三个等级:

    • 入门级:主要考察基础算法与编程能力。
    • 工作级:更贴近实际业务需求,可能涉及复杂的算法或与工作内容相关的场景题目。
    • 专业级:最高等级,考察深层次的算法以及优化能力,与薪资直接挂钩。

刷题策略与说明:

2024年8月14日之后,华为OD机试的题库转为 E卷,由往年题库(D卷、A卷、B卷、C卷)和全新题目组成。刷题时可以参考以下策略:

  1. 关注历年真题:

    • 题库中的旧题占比较大,建议优先刷历年的A卷、B卷、C卷、D卷题目。
    • 对于每道题目,建议深度理解其解题思路、代码实现,以及相关算法的适用场景。
  2. 适应新题目:

    • E卷中包含全新题目,需要掌握全面的算法知识和一定的灵活应对能力。
    • 建议关注新的刷题平台或交流群,获取最新题目的解析和动态。
  3. 掌握常见算法:
    华为OD考试通常涉及以下算法和数据结构:

    • 排序算法(快速排序、归并排序等)
    • 动态规划(背包问题、最长公共子序列等)
    • 贪心算法
    • 栈、队列、链表的操作
    • 图论(最短路径、最小生成树等)
    • 滑动窗口、双指针算法
  4. 保持编程规范:

    • 注重代码的可读性和注释的清晰度。
    • 熟练使用常见编程语言,如C++、Java、Python等。

如何获取资源?

  1. 官方参考:

    • 华为招聘官网或相关的招聘平台会有一些参考信息。
    • 华为OD的相关公众号可能也会发布相关的刷题资料或学习资源。
  2. 加入刷题社区:

    • 找到可信的刷题交流群,与其他备考的小伙伴交流经验。
    • 关注知名的刷题网站,如LeetCode、牛客网等,这些平台上有许多华为OD的历年真题和解析。
  3. 寻找系统性的教程:

    • 学习一本经典的算法书籍,例如《算法导论》《剑指Offer》《编程之美》等。
    • 完成系统的学习课程,例如数据结构与算法的在线课程。

积极心态与持续努力:

刷题的过程可能会比较枯燥,但它能够显著提升编程能力和算法思维。无论是为了通过华为OD的招聘考试,还是为了未来的职业发展,这些积累都会成为重要的财富。

考试注意细节

  1. 本地编写代码

    • 在本地 IDE(如 VS Code、PyCharm 等)上编写、保存和调试代码,确保逻辑正确后再复制粘贴到考试页面。这样可以减少语法错误,提高代码准确性。
  2. 调整心态,保持冷静

    • 遇到提示不足或实现不确定的问题时,不必慌张,可以采用更简单或更有把握的方法替代,确保思路清晰。
  3. 输入输出完整性

    • 注意训练和考试时都需要编写完整的输入输出代码,尤其是和题目示例保持一致。完成代码后务必及时调试,确保功能符合要求。
  4. 快捷键使用

    • 删除行可用 Ctrl+D,复制、粘贴和撤销分别为 Ctrl+CCtrl+VCtrl+Z,这些可以正常使用。
    • 避免使用 Ctrl+S,以免触发浏览器的保存功能。
  5. 浏览器要求

    • 使用最新版的 Google Chrome 浏览器完成考试,确保摄像头开启并正常工作。考试期间不要切换到其他网站,以免影响考试成绩。
  6. 交卷相关

    • 答题前,务必仔细查看题目示例,避免遗漏要求。
    • 每完成一道题后,点击【保存并调试】按钮,多次保存和调试是允许的,系统会记录得分最高的一次结果。完成所有题目后,点击【提交本题型】按钮。
    • 确保在考试结束前提交试卷,避免因未保存或调试失误而丢分。
  7. 时间和分数安排

    • 总时间:150 分钟;总分:400 分。
    • 试卷结构:2 道一星难度题(每题 100 分),1 道二星难度题(200 分)。及格分为 150 分。合理分配时间,优先完成自己擅长的题目。
  8. 考试环境准备

    • 考试前请备好草稿纸和笔。考试中尽量避免离开座位,确保监控画面正常。
    • 如需上厕所,请提前规划好时间以减少中途离开监控的可能性。
  9. 技术问题处理

    • 如果考试中遇到断电、断网、死机等技术问题,可以关闭浏览器并重新打开试卷链接继续作答。
    • 出现其他问题,请第一时间联系 HR 或监考人员进行反馈。

祝你考试顺利,取得理想成绩!

相关文章:

【2024年华为OD机试】(C卷,100分)- 查找接口成功率最优时间段 (JavaScriptJava PythonC/C++)

一、问题描述 题目解析 题目描述 服务之间交换的接口成功率作为服务调用关键质量特性&#xff0c;某个时间段内的接口失败率使用一个数组表示。数组中每个元素都是单位时间内失败率数值&#xff0c;数组中的数值为 0~100 的整数。给定一个数值 minAverageLost&#xff0c;表…...

Linux进度条实现

Linux进度条实现 1.\r\n2.缓冲区3.缓冲区分类4.进度条实现 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff1a;【Linux的学习】 &#x1f4dd;&#x1f4dd;本篇内容&#xff1a;\…...

Java如何实现反转义

Java如何实现反转义 前提 最近做的一个需求&#xff0c;是热搜词增加换一批的功能。功能做完自测后&#xff0c;交给了测试伙伴&#xff0c;但是测试第二天后就提了一个bug&#xff0c;出现了未知词 levis。第一眼看着像公司售卖的一个品牌-李维斯。然后再扒前人写的代码&…...

计算机网络 (57)改进“尽最大努力交付”的服务

前言 计算机网络中的“尽最大努力交付”服务是网络层的一种数据传输方式。这种服务的特点是网络层只负责尽力将数据报从源端传输到目的端&#xff0c;而不保证数据传输的可靠性。 一、标记与分类 为数据分组打上标记&#xff1a; 给不同性质的分组打上不同的标记&#x…...

Java 基于 SpringBoot 的校园外卖点餐平台微信小程序(附源码,部署,文档)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

重构(4)

&#xff08;一&#xff09;添加解释性变量&#xff0c;使得代码更容易理解&#xff0c;更容易调试&#xff0c;也可以方便功能复用 解释性的变量 总价格为商品总价&#xff08;单价*数量&#xff09;-折扣&#xff08;超过100个以上的打9折&#xff09;邮费&#xff08;原价的…...

【Arduino】语言参考功能

前言 翻译Arduino 参考处列出的常用函数。文中为了减少篇幅&#xff0c;达到能快速翻到查询的目标&#xff0c;在介绍函数中&#xff0c;对部分内容进行了省略&#xff0c;不会列出函数输入参数类型&#xff0c;以及使用注意事项等等&#xff0c;所以若是首次使用或者是调试时出…...

CMake使用CPack制作安装程序

CPack的功能很强大&#xff0c;笔者前面有一博文使用CMake的CPack工具打包项目介绍了一下使用CPack来打包成7z压缩文件&#xff0c;不仅如此&#xff0c;它还可以生成各平台的安装包。 CPack支持以下类型的生成器&#xff1a; 名称文件类型平台及说明STGZSTGZ(.sh)自解压文件…...

Flink运行时架构

一、系统架构 1&#xff09;作业管理器&#xff08;JobManager&#xff09; JobManager是一个Flink集群中任务管理和调度的核心&#xff0c;是控制应用执行的主进程。也就是说&#xff0c;每个应用都应该被唯一的JobManager所控制执行。 JobManger又包含3个不同的组件。 &am…...

平衡二叉树(力扣110)

所谓平衡二叉树&#xff0c;就是每一个节点的左右子树的高度差不大于1。而一个子树的高度&#xff0c;就是父节点的最大高度。这道题的思路其实和二叉树的最大深度(力扣104)-CSDN博客有很大的相似之处&#xff0c;都需要将左右子树的高度返回给父节点&#xff0c;因此也是采用后…...

【玩转全栈】---基于YOLO8的图片、视频目标检测

本篇主要讲YOLO8的具体操作&#xff0c;想要了解YOLO的具体原理&#xff0c;可以去官网查询 目录 下载ultralytics库 开始检测 介绍 YOLOv8&#xff08;You Only Look Once Version 8&#xff09;是 YOLO 系列的最新版本&#xff0c;由 Ultralytics 开发并发布&#xff0c;是一…...

ES6+新特性,var、let 和 const 的区别

在 JavaScript 中&#xff0c;var、let 和 const 都用于声明变量&#xff0c;但它们有一些重要的区别&#xff0c;主要体现在 作用域、可变性和提升机制 等方面。 1. 作用域&#xff08;Scope&#xff09; var: var 声明的变量是 函数作用域&#xff0c;也就是说&#xff0c;它…...

汇编实验·分支程序设计

一、实验目的: 1.能够熟练的进行分支程序的编写,掌握条件语句对应的汇编语言指令的实现 2.掌握多个条件的分支语句的实现原理,理解C语言中的逻辑运算“短路”特征 二、实验内容 1.对2和3任务中的C代码在VS2022中运行,设置生成对应的汇编代码,观察生成代码的不同,着重…...

激光线扫相机无2D图像的标定方案

方案一&#xff1a;基于运动控制平台的标定 适用场景&#xff1a;若激光线扫相机安装在可控运动平台&#xff08;如机械臂、平移台、旋转台&#xff09;上&#xff0c;且平台的运动精度已知&#xff08;例如通过编码器或高精度步进电机控制&#xff09;。 步骤&#xff1a; 标…...

【Python・机器学习】多元回归模型(原理及代码)

前言 自学笔记&#xff0c;分享给语言学/语言教育学方向的&#xff0c;但对语言数据处理感兴趣但是尚未入门&#xff0c;却需要在论文中用到的小伙伴&#xff0c;欢迎大佬们补充或绕道。ps&#xff1a;本文最少限度涉及公式讲解&#xff08;文科生小白友好体质&#xff09;&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&#xff0c;并使其继承TextView 1、自定义View时第一个构造函数 // 第一个构造函数主要是在Java代码中声明一个MyTextView时所用 // 类似这种(MyTextView myTextViewnew MyTextView(this);) // 不…...

linux中关闭服务的开机自启动

引言 systemctl 是 Linux 系统中用于管理 systemd 服务的命令行工具。它可以用来启动、停止、重启服务&#xff0c;管理服务的开机自启动&#xff0c;以及查看服务的状态等。 什么是 systemd&#xff1f; systemd 是现代 Linux 发行版中默认的 初始化系统&#xff08;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日最新报道&#xff0c;微软面向Release Preview频道的Windows Insider项目成员&#xff0c;发布了适用于Windows10 22H2版本的KB5050081更新&#xff0c;更新后系统版本号将升至19045.5435。本次更新增加了对GB18030-2022标准的支持&#xff0c;同时新版日历将为…...

VUE elTree 无子级 隐藏展开图标

这4个并没有下级节点&#xff0c;即它并不是叶子节点&#xff0c;就不需求展示前面的三角展开图标! 查阅官方文档如下描述&#xff0c;支持bool和函数回调处理&#xff0c;这里咱们选择更灵活的函数回调实现。 给el-tree结构配置一下props&#xff0c;注意&#xff01; :pr…...

python实现代理服务器转换

使用 http.server 模块和 requests 库来实现&#xff0c;代理服务器可拦截匹配指定路径的 HTTP 请求&#xff0c;并打印或存储请求头和响应体。 实现目标&#xff1a; 1、创建一个HTTP代理服务器。 2、代理所有流量&#xff0c;而对指定的接口&#xff08;如 /api/target&#…...

计算机网络三张表(ARP表、MAC表、路由表)总结

参考&#xff1a; 网络三张表&#xff1a;ARP表, MAC表, 路由表&#xff0c;实现你的网络自由&#xff01;&#xff01;_mac表、arp表、路由表-CSDN博客 网络中的三张表&#xff1a;ARP表、MAC表、路由表 首先要明确一件事&#xff0c;如果一个主机要发送数据&#xff0c;那么必…...

Dangerzone:免费的危险的文件转换安全程序

我们知道很多杀毒软件会将很多文件视作恶意程序&#xff0c;尤其是带宏病毒的DOC文件&#xff0c;直接删除难免会带来不必要的麻烦&#xff0c;那么推荐一款免费的危险的文件转换安全程序&#xff1a;Dangerzone 。它可以检查各种可能有危险的文件并将其转换为安全版本&#xf…...

2025/1/21 学习Vue的第四天

睡觉。 --------------------------------------------------------------------------------------------------------------------------------- 11.Object.defineProperty 1.在我们之前学习JS的时候&#xff0c;普通得定义一个对象与属性。 <!DOCTYPE html> <h…...

【IEEE Fellow 主讲报告| EI检索稳定】第五届机器学习与智能系统工程国际学术会议(MLISE 2025)

重要信息 会议时间地点&#xff1a;2025年6月13-15日 中国深圳 会议官网&#xff1a;http://mlise.org EI Compendex/Scopus稳定检索 会议简介 第五届机器学习与智能系统工程国际学术会议将于6月13-15日在中国深圳隆重召开。本次会议旨在搭建一个顶尖的学术交流平台&#xf…...

如何使用虚拟现实技术有效提升模拟训练效率

虚拟现实&#xff08;VR&#xff09;技术在模拟训练中的应用正逐步展现其巨大的潜力&#xff0c;通过提供高度沉浸式的体验、灵活的训练场景和精准的数据分析&#xff0c;显著提升训练效率。本文将结合Varjo XR-4头显、Techviz多通道显示软件、Senseglove虚拟现实手套等具体案例…...

OpenEuler学习笔记(十一):OpenEuler上搭建LAMP环境

LAMP环境指的是Linux、Apache、MySQL&#xff08;或MariaDB&#xff09;和PHP的组合&#xff0c;下面为你介绍在OpenEuler上搭建LAMP环境的详细步骤&#xff1a; 1. 系统更新 首先要更新系统中的软件包&#xff0c;保证系统处于最新状态。 sudo dnf update -y2. 安装Apache…...

Anaconda安装(2024最新版)

安装新的anaconda需要卸载干净上一个版本的anaconda&#xff0c;不然可能会在新版本安装过程或者后续使用过程中出错&#xff0c;完全卸载干净anaconda的方法&#xff0c;可以参考我的博客&#xff01; 第一步&#xff1a;下载anaconda安装包 官网&#xff1a;Anaconda | The O…...

【玩转全栈】----YOLO8训练自己的模型并应用

继上篇&#xff1a; 【玩转全栈】---基于YOLO8的图片、视频目标检测-CSDN博客 相信大家已经可以训练一些图片和视频了&#xff0c;接下来我将为大家介绍如何训练自己的特定模型&#xff0c;并用其进行检测 目录 准备数据 图片数据 标识数据 配置文件 运行 测试训练结果 存在的问…...

计算机视觉算法实战——无人机检测

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​ 1. 引言✨✨ 随着无人机技术的快速发展&#xff0c;无人机在农业、物流、监控等领域的应用越来越广泛。然而&#xff0c;无人机的滥用也带…...

css粘性定位超出指定宽度失效问题

展示效果 解决办法&#xff1a;外层容器添加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++

在我们遇到的算法题中&#xff0c; ⼀般给出的树结构都是有编号的&#xff0c;这样会简化我们之后存储树的操作 &#xff0c;⼀般提供两个信息&#xff1b; 结点的个数 n;n-1条x结点与y结点相连的边 题⽬描述: ⼀共9个结点셈 1号结点为根节点&#xff0c;接下来8⾏&#xff…...

高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?

如果有遗漏,评论区告诉我进行补充 面试官: 主键与索引有什么区别 ? 我回答: 一、主键&#xff08;Primary Key&#xff09; 1. 定义 主键是关系型数据库中的一条记录中的某个属性组&#xff08;可以是一个字段或多个字段的组合&#xff09;&#xff0c;用于唯一标识一条记…...

spring aop 中 返回值

使用环绕切面 Around(value "requsetInterceptor()")public Object logExectionTime(ProceedingJoinPoint joinPoint) throws Throwable {logger.info("-------logExectionTime--------");if(isRun){Object proceed joinPoint.proceed(); // 执行目标方…...

总结7。。

二叉树的遍历是指按某条搜索路径访问树中的每个结点&#xff0c;使得每个结点均被访问一次&#xff0c;而且仅能访问一次&#xff08;说明不可二次访问&#xff0c;一遍而过&#xff09;。遍历一颗二叉树便要决定对根结点N、左子树L和右子树的访问顺序。 二叉树常的的遍历方法有…...

9.中断系统、EXTI外部中断

中断系统原理 中断 中断系统是管理和执行中断的逻辑结构&#xff0c;外部中断是众多能产生中断的外设之一&#xff0c;所以本节我们就借助外部中断来学习一下中断系统。在以后学习其它外设的时候&#xff0c;也是会经常和中断打交道的。 中断&#xff1a;在主程序运行过程中…...

【软件测试项目实战 】淘宝网:商品购买功能测试

一、用例设计方法分析 在对淘宝网商品下单功能进行测试时&#xff0c;不同的测试角度和场景适合运用不同的用例设计方法&#xff0c;以下是针对该功能各方面测试所适用方法及其原因的分析&#xff1a; 商品数量相关测试&#xff1a;对于商品数量的测试&#xff0c;主要采用等…...

TangoFlux 本地部署实用教程:开启无限音频创意脑洞

一、介绍 TangoFlux是通过流匹配和 Clap-Ranked 首选项优化&#xff0c;实现超快速、忠实的文本到音频生成的模型。 本模型由 Stability AI 提供支持&#x1f680; TangoFlux 可以在单个 A40 GPU 上在 ~3 秒内生成长达 34.1kHz 的立体声音频。 二、部署 安装方式非常简单 1…...

Android多语言开发自动化生成工具

在做 Android 开发的过程中&#xff0c;经常会遇到多语言开发的场景&#xff0c;尤其在车载项目中&#xff0c;多语言开发更为常见。对应多语言开发&#xff0c;通常都是在中文版本的基础上开发其他国家语言&#xff0c;这里我们会拿到中-外语言对照表&#xff0c;这里的工作难…...

Mac cursor设置jdk、Maven版本

基本配置 – Cursor 使用文档 首先是系统用户级别的设置参数&#xff0c;运行cursor&#xff0c;按下ctrlshiftp&#xff0c;输入Open User Settings(JSON)&#xff0c;在弹出的下拉菜单中选中下面这样的&#xff1a; 在打开的json编辑器中追加下面的内容&#xff1a; {"…...

Unity中在UI上画线

在UI中画一条曲线 我封装了一个组件,可以实现基本的画线需求. 效果 按住鼠标左键随手一画. 用起来也很简单,将组件挂到空物体上就行了,红色的背景是Panel. 你可以将该组件理解为一个Image,只不过形状更灵活一些罢了,所以它要放在下面的层级(不然可能会被挡住). 代码 可以…...

Unity中关于实现 管道水流+瀑布流动+大肠蠕动效果笔记

Unity中关于实现 管道水流瀑布流动大肠蠕动效果笔记 效果展示&#xff1a; 参考资料及链接&#xff1a; 1、如何在 Unity 中创建水效果 - 水弯曲教程 https://www.youtube.com/watch?v3CcWus6d_B8 关于补充个人技能中&#xff1a;顶点噪波影响网格着色器配合粒子实现水特效 …...

【ARTS】【LeetCode-704】二分查找算法

目录 前言 什么是ARTS&#xff1f; 算法 力扣704题 二分查找 基本思想&#xff1a; 二分查找算法(递归的方式): 经典写法(找单值): 代码分析: 经典写法(找数组即多个返回值) 代码分析 经典题目 题目描述&#xff1a; 官方题解 深入思考 模版一 (相错终止/左闭右闭) 相等返回情形…...

JavaWeb 学习笔记 XML 和 Json 篇 | 020

今日推荐语 愿你遇见好天气,愿你的征途铺满了星星——圣埃克苏佩里 日期 学习内容 打卡编号2025年01月23日JavaWeb笔记 XML 和 Json 篇020 前言 哈喽&#xff0c;我是菜鸟阿康。 以下是我的学习笔记&#xff0c;既做打卡也做分享&#xff0c;希望对你也有所帮助…...

【LeetCode】--- MySQL刷题集合

1.组合两个表&#xff08;外连接&#xff09; select p.firstName,p.lastName,a.city,a.state from Person p left join Address a on p.personId a.personId; 以左边表为基准&#xff0c;去连接右边的表。取两表的交集和左表的全集 2.第二高的薪水 &#xff08;子查询、if…...

【深度解析Java 20天速成】04_IDEA的安装与使用

【Why IDEA ?】 【注】JetBrains官方说明&#xff1a; 尽管我们采取了多种措施确保受访者的代表性&#xff0c;但结果可能会略微偏向 JetBrains 产品的用户&#xff0c;因为这些用户更有可能参加调查。 此外&#xff0c;2022年&#xff0c;某美国软件开发商在对近千名专业的Ja…...

系统思考—业务协同

最近在和一些客户的沟通中&#xff0c;企业老板都提到一个共同的困惑&#xff1a;每个部门都感觉自己在解决问题&#xff0c;做了正确的事情&#xff0c;但为什么组织的绩效就是没有增长&#xff1f;更糟糕的是&#xff0c;大家都不知道问题到底出在哪里&#xff1f; 在这种情…...

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 创建字符串对象的两种方式&#xff1a; Java的内存模型 字符串常量池&#xff08;串池&#xff09;存放地址 两种构造方法的内存分析 String的常用方法 号比较的是什么 字符串比较&#xff08;比较字符串的数据值&#xff09; 遍历字符串 StringBui…...