【2024年华为OD机试】(A卷,200分)- 优雅子数组 (JavaScriptJava PythonC/C++)

在这里插入图片描述

一、问题描述

题目描述

如果一个数组中出现次数最多的元素出现大于等于 k 次,被称为 k-优雅数组k 也可以被称为优雅阈值。

例如:

  • 数组 [1, 2, 3, 1, 2, 3, 1] 是一个 3-优雅数组,因为元素 1 出现次数大于等于 3 次。
  • 数组 [1, 2, 3, 1, 2] 不是一个 3-优雅数组,因为其中出现次数最多的元素是 12,只出现了 2 次。

给定一个数组 Ak,请求出 A 有多少子数组是 k-优雅子数组

子数组是数组中一个或多个连续元素组成的数组。

例如,数组 [1, 2, 3, 4] 包含 10 个子数组,分别是:

  • [1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]

输入描述

  • 第一行输入两个数字,以空格隔开,含义是:A 数组长度 k 值。
  • 第二行输入 A 数组元素,以空格隔开。

输出描述

输出 A 有多少子数组是 k-优雅子数组


用例

用例 1

输入:

7 3
1 2 3 1 2 3 1

输出:

1

说明:

  • 只有子数组 [1, 2, 3, 1, 2, 3, 1]3-优雅子数组

用例 2

输入:

7 2
1 2 3 1 2 3 1

输出:

10

说明:

  • 有多个子数组满足 2-优雅子数组 的条件。

题目解析

解题思路

  1. 暴力枚举法

    • 使用双指针(双重 for 循环)枚举所有子数组。
    • 外层指针 i 指向子数组左边界,内层指针 j 指向子数组右边界。
    • 统计每个子数组内部各数字的出现次数,若某个数字出现次数大于等于 k,则该子数组符合要求,统计结果 ans++
  2. 优化思路

    • 暴力枚举法的时间复杂度为 O(n^2),对于大规模数据会超时。
    • 优化点:
      • 使用 滑动窗口 的思想,减少重复统计。
      • 当找到一个符合要求的子数组后,右指针 j 不需要回退,而是继续向右移动。
      • 左指针 i 右移时,更新统计结果,避免重复计算。
  3. 滑动窗口优化

    • 使用一个哈希表(或数组)记录当前窗口内各数字的出现次数。
    • 当某个数字的出现次数达到 k 时,记录当前窗口的贡献值(即从当前右边界到数组末尾的所有子数组都符合要求)。
    • 左指针 i 右移时,更新哈希表,并检查是否仍然满足条件。
  4. 边界条件

    • 当左指针 i 右移时,需要减少左边界元素的计数。
    • 当右指针 j 右移时,需要增加右边界元素的计数。
    • 确保每次移动指针后,窗口内的统计结果正确。

双指针运动逻辑

  1. 初始状态

    • 左指针 l = 0,右指针 r = 0
    • 哈希表 count 记录当前窗口内各数字的出现次数。
  2. 右指针移动

    • 将右指针 r 指向的元素加入窗口,并更新哈希表。
    • 若某个数字的出现次数达到 k,则记录当前窗口的贡献值。
  3. 左指针移动

    • 当窗口内某个数字的出现次数超过 k 时,左指针 l 右移。
    • 减少左边界元素的计数,并更新哈希表。
  4. 贡献值计算

    • 当找到一个符合要求的子数组时,从当前右边界到数组末尾的所有子数组都符合要求。
    • 贡献值为 n - r,其中 n 是数组长度。

示例分析

以输入 7 2 和数组 [1, 2, 3, 1, 2, 3, 1] 为例:

  1. 初始状态

    • l = 0, r = 0
    • 窗口为 [1]count = {1: 1}
  2. 右指针移动

    • r = 1,窗口为 [1, 2]count = {1: 1, 2: 1}
    • r = 2,窗口为 [1, 2, 3]count = {1: 1, 2: 1, 3: 1}
    • r = 3,窗口为 [1, 2, 3, 1]count = {1: 2, 2: 1, 3: 1}
    • 此时 1 的出现次数达到 2,贡献值为 7 - 3 = 4
  3. 左指针移动

    • l = 1,窗口为 [2, 3, 1]count = {1: 1, 2: 1, 3: 1}
    • r = 4,窗口为 [2, 3, 1, 2]count = {1: 1, 2: 2, 3: 1}
    • 此时 2 的出现次数达到 2,贡献值为 7 - 4 = 3
  4. 继续移动

    • 重复上述过程,直到右指针 r 到达数组末尾。

总结

  • 通过滑动窗口优化,减少重复统计,时间复杂度降低到 O(n)
  • 使用哈希表记录窗口内各数字的出现次数,确保统计结果正确。
  • 每次找到符合要求的子数组后,计算贡献值并累加到结果中。

二、JavaScript算法源码

以下是代码的详细注释和讲解,帮助理解每一部分的作用和逻辑:


代码讲解

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");// 创建 readline 接口,用于从控制台读取输入
const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});// 定义数组 lines,用于存储输入的行数据
const lines = [];
// 定义变量 n 和 k,分别表示数组长度和优雅阈值
let n, k;// 监听 'line' 事件,当用户输入一行内容时触发
rl.on("line", (line) => {// 将输入的行数据存入 lines 数组lines.push(line);// 当 lines 数组中有两行数据时,表示输入完成if (lines.length === 2) {// 解析第一行输入,获取数组长度 n 和优雅阈值 k[n, k] = lines[0].split(" ").map(Number);// 解析第二行输入,获取数组 arrconst arr = lines[1].split(" ").map(Number);// 调用 getResult 函数,计算 k-优雅子数组的数量,并输出结果console.log(getResult(arr, n, k));// 清空 lines 数组,以便处理下一组输入lines.length = 0;}
});// 定义 getResult 函数,用于计算 k-优雅子数组的数量
function getResult(arr, n, k) {// 初始化变量 ans,用于记录 k-优雅子数组的数量let ans = 0;// 初始化双指针 l 和 r,分别表示滑动窗口的左边界和右边界let l = 0;let r = 0;// 定义对象 count,用于记录滑动窗口内各数字的出现次数const count = {};// 使用滑动窗口遍历数组while (l < n && r < n) {// 获取右指针 r 指向的数组元素const c = arr[r];// 更新当前数字 c 的出现次数count[c] ? count[c]++ : (count[c] = 1);// 如果当前数字 c 的出现次数达到 k 次if (count[c] >= k) {// 计算当前窗口的贡献值,即从当前右边界到数组末尾的所有子数组都符合要求ans += n - r;// 左指针 l 右移一格,减少左边界元素的计数count[arr[l]]--;l++;// 右指针 r 左移一格,回退到上一个位置count[c]--;r--;}// 右指针 r 右移一格,继续扩展窗口r++;}// 返回最终找到的 k-优雅子数组的数量return ans;
}

代码逻辑详解

  1. 输入处理:

    • 使用 readline 模块从控制台读取输入。
    • 将输入的两行数据分别解析为数组长度 n、优雅阈值 k 和数组 arr
  2. 滑动窗口初始化:

    • 定义双指针 lr,分别表示滑动窗口的左边界和右边界,初始值均为 0。
    • 定义对象 count,用于记录滑动窗口内各数字的出现次数。
  3. 滑动窗口遍历:

    • 使用 while 循环遍历数组,右指针 r 从 0 开始逐步向右移动。
    • 对于每个右指针 r 指向的元素 c,更新其在 count 中的出现次数。
  4. 判断是否符合条件:

    • 如果当前数字 c 的出现次数达到 k 次,则:
      • 计算当前窗口的贡献值,即从当前右边界到数组末尾的所有子数组都符合要求,贡献值为 n - r
      • 左指针 l 右移一格,减少左边界元素的计数。
      • 右指针 r 左移一格,回退到上一个位置。
  5. 右指针移动:

    • 右指针 r 右移一格,继续扩展窗口。
  6. 返回结果:

    • 遍历结束后,返回 ans,即 k-优雅子数组的数量。

示例运行

以输入 7 2 和数组 [1, 2, 3, 1, 2, 3, 1] 为例:

  1. 初始状态:

    • l = 0, r = 0
    • 窗口为 [1]count = {1: 1}
  2. 右指针移动:

    • r = 1,窗口为 [1, 2]count = {1: 1, 2: 1}
    • r = 2,窗口为 [1, 2, 3]count = {1: 1, 2: 1, 3: 1}
    • r = 3,窗口为 [1, 2, 3, 1]count = {1: 2, 2: 1, 3: 1}
    • 此时 1 的出现次数达到 2 次,贡献值为 7 - 3 = 4
  3. 左指针移动:

    • l = 1,窗口为 [2, 3, 1]count = {1: 1, 2: 1, 3: 1}
    • r = 4,窗口为 [2, 3, 1, 2]count = {1: 1, 2: 2, 3: 1}
    • 此时 2 的出现次数达到 2 次,贡献值为 7 - 4 = 3
  4. 继续移动:

    • 重复上述过程,直到右指针 r 到达数组末尾。

总结

  • 该代码通过滑动窗口的方法,高效地统计了数组中所有 k-优雅子数组的数量。
  • 使用双指针和哈希表记录窗口内各数字的出现次数,确保统计结果正确。
  • 每次找到符合要求的子数组后,计算贡献值并累加到结果中,避免了重复计算。

三、Java算法源码

以下是 Java 代码的详细注释和讲解,帮助理解每一部分的作用和逻辑:


代码讲解

import java.util.HashMap;
import java.util.Scanner;public class Main {public static void main(String[] args) {// 创建 Scanner 对象,用于从控制台读取输入Scanner sc = new Scanner(System.in);// 读取数组长度 n 和优雅阈值 kint n = sc.nextInt();int k = sc.nextInt();// 定义数组 arr,用于存储输入的数组元素Integer[] arr = new Integer[n];for (int i = 0; i < n; i++) {arr[i] = sc.nextInt();}// 调用 getResult 方法,计算 k-优雅子数组的数量,并输出结果System.out.println(getResult(arr, n, k));}public static Integer getResult(Integer[] arr, Integer n, Integer k) {// 初始化变量 ans,用于记录 k-优雅子数组的数量int ans = 0;// 初始化双指针 l 和 r,分别表示滑动窗口的左边界和右边界int l = 0;int r = 0;// 定义 HashMap count,用于记录滑动窗口内各数字的出现次数HashMap<Integer, Integer> count = new HashMap<>();// 使用滑动窗口遍历数组while (l < n && r < n) {// 获取右指针 r 指向的数组元素Integer c = arr[r];// 更新当前数字 c 的出现次数count.put(c, count.getOrDefault(c, 0) + 1);// 如果当前数字 c 的出现次数达到 k 次if (count.get(c) >= k) {// 计算当前窗口的贡献值,即从当前右边界到数组末尾的所有子数组都符合要求ans += n - r;// 左指针 l 右移一格,减少左边界元素的计数count.put(arr[l], count.get(arr[l]) - 1);l++;// 右指针 r 左移一格,回退到上一个位置count.put(c, count.get(c) - 1);r--;}// 右指针 r 右移一格,继续扩展窗口r++;}// 返回最终找到的 k-优雅子数组的数量return ans;}
}

代码逻辑详解

  1. 输入处理:

    • 使用 Scanner 从控制台读取输入的数组长度 n 和优雅阈值 k
    • 读取数组 arr 的元素并存储到 Integer[] 数组中。
  2. 滑动窗口初始化:

    • 定义双指针 lr,分别表示滑动窗口的左边界和右边界,初始值均为 0。
    • 定义 HashMap 对象 count,用于记录滑动窗口内各数字的出现次数。
  3. 滑动窗口遍历:

    • 使用 while 循环遍历数组,右指针 r 从 0 开始逐步向右移动。
    • 对于每个右指针 r 指向的元素 c,更新其在 count 中的出现次数。
  4. 判断是否符合条件:

    • 如果当前数字 c 的出现次数达到 k 次,则:
      • 计算当前窗口的贡献值,即从当前右边界到数组末尾的所有子数组都符合要求,贡献值为 n - r
      • 左指针 l 右移一格,减少左边界元素的计数。
      • 右指针 r 左移一格,回退到上一个位置。
  5. 右指针移动:

    • 右指针 r 右移一格,继续扩展窗口。
  6. 返回结果:

    • 遍历结束后,返回 ans,即 k-优雅子数组的数量。

示例运行

以输入 7 2 和数组 [1, 2, 3, 1, 2, 3, 1] 为例:

  1. 初始状态:

    • l = 0, r = 0
    • 窗口为 [1]count = {1: 1}
  2. 右指针移动:

    • r = 1,窗口为 [1, 2]count = {1: 1, 2: 1}
    • r = 2,窗口为 [1, 2, 3]count = {1: 1, 2: 1, 3: 1}
    • r = 3,窗口为 [1, 2, 3, 1]count = {1: 2, 2: 1, 3: 1}
    • 此时 1 的出现次数达到 2 次,贡献值为 7 - 3 = 4
  3. 左指针移动:

    • l = 1,窗口为 [2, 3, 1]count = {1: 1, 2: 1, 3: 1}
    • r = 4,窗口为 [2, 3, 1, 2]count = {1: 1, 2: 2, 3: 1}
    • 此时 2 的出现次数达到 2 次,贡献值为 7 - 4 = 3
  4. 继续移动:

    • 重复上述过程,直到右指针 r 到达数组末尾。

总结

  • 该代码通过滑动窗口的方法,高效地统计了数组中所有 k-优雅子数组的数量。
  • 使用双指针和 HashMap 记录窗口内各数字的出现次数,确保统计结果正确。
  • 每次找到符合要求的子数组后,计算贡献值并累加到结果中,避免了重复计算。

四、Python算法源码

以下是 Python 代码的详细注释和讲解,帮助理解每一部分的作用和逻辑:


代码讲解

# 输入获取
n, k = map(int, input().split())  # 读取数组长度 n 和优雅阈值 k
arr = list(map(int, input().split()))  # 读取数组元素并转换为整数列表# 算法入口
def getResult(arr, n, k):# 初始化变量 ans,用于记录 k-优雅子数组的数量ans = 0# 初始化双指针 l 和 r,分别表示滑动窗口的左边界和右边界l = 0r = 0# 定义字典 count,用于记录滑动窗口内各数字的出现次数count = {}# 使用滑动窗口遍历数组while l < n and r < n:# 获取右指针 r 指向的数组元素c = arr[r]# 如果当前数字 c 不在 count 中,则初始化为 0if count.get(c) is None:count[c] = 0# 更新当前数字 c 的出现次数count[c] += 1# 如果当前数字 c 的出现次数达到 k 次if count[c] >= k:# 计算当前窗口的贡献值,即从当前右边界到数组末尾的所有子数组都符合要求ans += n - r# 左指针 l 右移一格,减少左边界元素的计数count[arr[l]] -= 1l += 1# 右指针 r 左移一格,回退到上一个位置count[c] -= 1r -= 1# 右指针 r 右移一格,继续扩展窗口r += 1# 返回最终找到的 k-优雅子数组的数量return ans# 算法调用
print(getResult(arr, n, k))

代码逻辑详解

  1. 输入处理:

    • 使用 input().split() 读取输入的两行数据。
    • 第一行数据解析为数组长度 n 和优雅阈值 k
    • 第二行数据解析为数组 arr,并将其转换为整数列表。
  2. 滑动窗口初始化:

    • 定义双指针 lr,分别表示滑动窗口的左边界和右边界,初始值均为 0。
    • 定义字典 count,用于记录滑动窗口内各数字的出现次数。
  3. 滑动窗口遍历:

    • 使用 while 循环遍历数组,右指针 r 从 0 开始逐步向右移动。
    • 对于每个右指针 r 指向的元素 c,更新其在 count 中的出现次数。
  4. 判断是否符合条件:

    • 如果当前数字 c 的出现次数达到 k 次,则:
      • 计算当前窗口的贡献值,即从当前右边界到数组末尾的所有子数组都符合要求,贡献值为 n - r
      • 左指针 l 右移一格,减少左边界元素的计数。
      • 右指针 r 左移一格,回退到上一个位置。
  5. 右指针移动:

    • 右指针 r 右移一格,继续扩展窗口。
  6. 返回结果:

    • 遍历结束后,返回 ans,即 k-优雅子数组的数量。

示例运行

以输入 7 2 和数组 [1, 2, 3, 1, 2, 3, 1] 为例:

  1. 初始状态:

    • l = 0, r = 0
    • 窗口为 [1]count = {1: 1}
  2. 右指针移动:

    • r = 1,窗口为 [1, 2]count = {1: 1, 2: 1}
    • r = 2,窗口为 [1, 2, 3]count = {1: 1, 2: 1, 3: 1}
    • r = 3,窗口为 [1, 2, 3, 1]count = {1: 2, 2: 1, 3: 1}
    • 此时 1 的出现次数达到 2 次,贡献值为 7 - 3 = 4
  3. 左指针移动:

    • l = 1,窗口为 [2, 3, 1]count = {1: 1, 2: 1, 3: 1}
    • r = 4,窗口为 [2, 3, 1, 2]count = {1: 1, 2: 2, 3: 1}
    • 此时 2 的出现次数达到 2 次,贡献值为 7 - 4 = 3
  4. 继续移动:

    • 重复上述过程,直到右指针 r 到达数组末尾。

总结

  • 该代码通过滑动窗口的方法,高效地统计了数组中所有 k-优雅子数组的数量。
  • 使用双指针和字典记录窗口内各数字的出现次数,确保统计结果正确。
  • 每次找到符合要求的子数组后,计算贡献值并累加到结果中,避免了重复计算。

五、C/C++算法源码:

以下是 C++C语言 代码的中文详细注释和讲解,帮助理解每一部分的作用和逻辑:


C++ 代码

#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;int getResult(vector<int>& arr, int n, int k) {int ans = 0; // 用于记录 k-优雅子数组的数量int l = 0; // 滑动窗口的左边界int r = 0; // 滑动窗口的右边界unordered_map<int, int> count; // 用于记录滑动窗口内各数字的出现次数// 使用滑动窗口遍历数组while (l < n && r < n) {int c = arr[r]; // 获取右指针 r 指向的数组元素// 如果当前数字 c 不在 count 中,则初始化为 0if (count.find(c) == count.end()) {count[c] = 0;}// 更新当前数字 c 的出现次数count[c]++;// 如果当前数字 c 的出现次数达到 k 次if (count[c] >= k) {// 计算当前窗口的贡献值,即从当前右边界到数组末尾的所有子数组都符合要求ans += n - r;// 左指针 l 右移一格,减少左边界元素的计数count[arr[l]]--;l++;// 右指针 r 左移一格,回退到上一个位置count[c]--;r--;}// 右指针 r 右移一格,继续扩展窗口r++;}// 返回最终找到的 k-优雅子数组的数量return ans;
}int main() {int n, k;cin >> n >> k; // 读取数组长度 n 和优雅阈值 kvector<int> arr(n);for (int i = 0; i < n; i++) {cin >> arr[i]; // 读取数组元素}// 调用 getResult 函数,计算 k-优雅子数组的数量,并输出结果cout << getResult(arr, n, k) << endl;return 0;
}

C 语言代码

#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100000 // 定义数组的最大长度int getResult(int arr[], int n, int k) {int ans = 0; // 用于记录 k-优雅子数组的数量int l = 0; // 滑动窗口的左边界int r = 0; // 滑动窗口的右边界int count[MAX_SIZE] = {0}; // 用于记录滑动窗口内各数字的出现次数// 使用滑动窗口遍历数组while (l < n && r < n) {int c = arr[r]; // 获取右指针 r 指向的数组元素// 更新当前数字 c 的出现次数count[c]++;// 如果当前数字 c 的出现次数达到 k 次if (count[c] >= k) {// 计算当前窗口的贡献值,即从当前右边界到数组末尾的所有子数组都符合要求ans += n - r;// 左指针 l 右移一格,减少左边界元素的计数count[arr[l]]--;l++;// 右指针 r 左移一格,回退到上一个位置count[c]--;r--;}// 右指针 r 右移一格,继续扩展窗口r++;}// 返回最终找到的 k-优雅子数组的数量return ans;
}int main() {int n, k;scanf("%d %d", &n, &k); // 读取数组长度 n 和优雅阈值 kint arr[MAX_SIZE];for (int i = 0; i < n; i++) {scanf("%d", &arr[i]); // 读取数组元素}// 调用 getResult 函数,计算 k-优雅子数组的数量,并输出结果printf("%d\n", getResult(arr, n, k));return 0;
}

代码逻辑详解

  1. 输入处理:

    • C++: 使用 cin 从控制台读取输入的数组长度 n 和优雅阈值 k,以及数组 arr
    • C: 使用 scanf 从控制台读取输入的数组长度 n 和优雅阈值 k,以及数组 arr
  2. 滑动窗口初始化:

    • 定义双指针 lr,分别表示滑动窗口的左边界和右边界,初始值均为 0。
    • 定义哈希表(C++ 使用 unordered_map,C 使用数组)count,用于记录滑动窗口内各数字的出现次数。
  3. 滑动窗口遍历:

    • 使用 while 循环遍历数组,右指针 r 从 0 开始逐步向右移动。
    • 对于每个右指针 r 指向的元素 c,更新其在 count 中的出现次数。
  4. 判断是否符合条件:

    • 如果当前数字 c 的出现次数达到 k 次,则:
      • 计算当前窗口的贡献值,即从当前右边界到数组末尾的所有子数组都符合要求,贡献值为 n - r
      • 左指针 l 右移一格,减少左边界元素的计数。
      • 右指针 r 左移一格,回退到上一个位置。
  5. 右指针移动:

    • 右指针 r 右移一格,继续扩展窗口。
  6. 返回结果:

    • 遍历结束后,返回 ans,即 k-优雅子数组的数量。

示例运行

以输入 7 2 和数组 [1, 2, 3, 1, 2, 3, 1] 为例:

  1. 初始状态:

    • l = 0, r = 0
    • 窗口为 [1]count = {1: 1}
  2. 右指针移动:

    • r = 1,窗口为 [1, 2]count = {1: 1, 2: 1}
    • r = 2,窗口为 [1, 2, 3]count = {1: 1, 2: 1, 3: 1}
    • r = 3,窗口为 [1, 2, 3, 1]count = {1: 2, 2: 1, 3: 1}
    • 此时 1 的出现次数达到 2 次,贡献值为 7 - 3 = 4
  3. 左指针移动:

    • l = 1,窗口为 [2, 3, 1]count = {1: 1, 2: 1, 3: 1}
    • r = 4,窗口为 [2, 3, 1, 2]count = {1: 1, 2: 2, 3: 1}
    • 此时 2 的出现次数达到 2 次,贡献值为 7 - 4 = 3
  4. 继续移动:

    • 重复上述过程,直到右指针 r 到达数组末尾。

总结

  • C++C 代码逻辑一致,均通过滑动窗口的方法高效地统计了数组中所有 k-优雅子数组的数量。
  • 使用双指针和哈希表(或数组)记录窗口内各数字的出现次数,确保统计结果正确。
  • 每次找到符合要求的子数组后,计算贡献值并累加到结果中,避免了重复计算。

六、尾言

什么是华为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 或监考人员进行反馈。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6228.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子应用设计方案102:智能家庭AI鱼缸系统设计

智能家庭 AI 鱼缸系统设计 一、引言 智能家庭 AI 鱼缸系统旨在为鱼类提供一个健康、舒适的生活环境&#xff0c;同时为用户提供便捷的管理和观赏体验。 二、系统概述 1. 系统目标 - 自动维持水质稳定&#xff0c;包括水温、酸碱度、硬度和溶氧量等关键指标。 - 智能投食&…

智能化加速标准和协议的更新并推动验证IP(VIP)在芯片设计中的更广泛应用

作者&#xff1a;Karthik Gopal, SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 随着AI技术向边缘和端侧设备广泛渗透&#xff0c;芯片设计师不仅需要考虑在其设计中引入加速器&#xff0c;也在考虑采用速度更快和带宽更高的总…

Vue3.5 企业级管理系统实战(三):页面布局及样式处理 (Scss UnoCSS )

本章主要是关于整体页面布局及样式处理&#xff0c;在进行这一章代码前&#xff0c;先将前两章中的示例代码部分删除&#xff08;如Home.vue、About.vue、counter.ts、App.vue中引用等&#xff09; 1 整体页面布局 页面整体布局构成了产品的框架基础&#xff0c;通常涵盖主导…

Linux 消息队列的使用方法

文章目录 1.概念2. 创建消息队列3. 发送消息4. 接收消息5. 消息结构体6. 消息队列控制&#xff08;删除、获取队列状态&#xff09;消息队列是否存在7. 使用场景8. 注意事项使用例子判断消息队列是否存在的代码获取队列空间大小 1.概念 消息队列是一种进程间通信 (IPC) 机制&a…

低代码可视化-转盘小游戏可视化-代码生成器

转盘小程序是一种互动工具&#xff0c;它通过模拟真实的转盘抽奖或决策体验&#xff0c;为用户提供了一种有趣且公平的选择方式。以下是对转盘小程序的详细介绍&#xff1a; 转盘小程序的应用场景 日常决策&#xff1a;转盘小程序可以帮助用户解决日常生活中的选择困难问题&a…

【Prometheus】Prometheus如何监控Haproxy

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

仅仅4M!windows系统适用,免费无限制使用!

软件介绍 在日常生活里&#xff0c;我们经常会碰到电脑运行迟缓、网速卡顿的现象&#xff0c;却又不清楚是哪个程序在占用过多资源。这种时候&#xff0c;一款能实时监测网络和系统状态的工具就变得非常关键了。今天呢&#xff0c;就给大家介绍一个小巧又实用的监控工具——「T…

计算机毕业设计hadoop+spark+hive图书推荐系统 豆瓣图书数据分析可视化大屏 豆瓣图书爬虫 知识图谱 图书大数据 大数据毕业设计 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Harmony Next 支持创建分身

应用分身能实现在一个设备上安装多个相同的应用&#xff0c;实现多个账号同时登录使用和运行并且互不影响。主要应用场景有社交账号双开、游戏大小号双开等&#xff0c;无需账号切换&#xff0c;从而省去频繁登录的繁琐。 Harmony Next 很容易就能让 App 支持创建分身。 官方文…

Linux下 date时间应该与系统的 RTC(硬件时钟)同步

发现客户服务器时间与真实时间不同&#xff0c;并且服务器没有网络。 解决办法&#xff1a;时间应该与系统的 RTC&#xff08;硬件时钟&#xff09;同步 手动设置系统时间 使用 date 命令将系统时间设置为 2025年01月21日 14:12:00&#xff1a; sudo date --set"2025-01…

XX污水处理厂基于RK3576核心板应用(四)——人员倒地智能识别系统方案

通过 SAIL-RK3576核心板 支撑的 人员倒地识别系统&#xff0c;污水处理厂能够在广阔、复杂的区域内实时监控人员安全&#xff0c;实现意外倒地等事故的秒级响应与干预。搭配多元人形动态监测机制&#xff0c;还可进一步拓展对其他异常动作或不安全行为的识别&#xff0c;持续保…

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

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

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>&…

随机变量的变量替换——归一化流和直方图规定化的数学基础

变量替换是一种在统计学和数学中广泛应用的技术&#xff0c;它通过定义新的变量来简化问题&#xff0c;使得原本复杂的随机变量变得更加容易分析。 变量替换的公式&#xff0c;用于将一个随机变量 X X X 的概率密度函数 f X f_X fX​ 转换为其经过函数 g g g 变换后的随机变…

Scrapy之一个item包含多级页面的处理方案

目标 在实际开发过程中&#xff0c;我们所需要的数据往往需要通过多个页面的数据汇总得到&#xff0c;通过列表获取到的数据只有简单的介绍。站在Scrapy框架的角度来看&#xff0c;实际上就是考虑如何处理一个item包含多级页面数据的问题。本文将以获取叶子猪网站的手游排行榜及…

应用层协议 HTTP 讲解实战:从0实现HTTP 服务器

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; HTTP 协议 &#x1f98b; 认识 URL&#x1f98b; urlencode 和 urldecode 二&#xff1a;&#x1f525; HTTP 协议请求与响应格式 &#x1f98b; HTTP 请求…

Ansys Motor-CAD:IPM 电机实验室 - 扭矩速度曲线

各位电动机迷们&#xff0c;大家好&#xff1a; 在本博客中&#xff0c;我讨论了如何使用 Ansys Motor-CAD 通过 LAB 模块获取扭矩速度曲线。使用每安培最大扭矩电机控制策略&#xff0c;并涵盖恒定扭矩区域和恒定功率、磁通减弱区域。分析了高转子速度如何影响功率输出。 模型…

IPhone16 Pro 设备详情

目录 产品宣传图内部图——前内部图——后设备详细信息 产品宣传图 内部图——前 内部图——后 设备详细信息 信息收集于HubWeb.cn

SQL注入漏洞之基础数据类型注入 字符 数字 搜索 XX 以及靶场实例哟

目录 基础数据类型SQL注入 字符类型注入 单引号双引号解释 案例练习: 数字类型注入 案例 搜索性注入: 案例 XX性注入: 语句 案例 基础SQL注入类型分类 基础数据类型SQL注入 字符类型注入 xxx or 11 # select id,email from member where usernamexx or 11 # --…

【Elasticsearch】腾讯云安装Elasticsearch

Elasticsearch 认识Elasticsearch安装Elasticsearch安装Kibana安装IK分词器分词器的作用是什么&#xff1f;IK分词器有几种模式&#xff1f;IK分词器如何拓展词条&#xff1f;如何停用词条&#xff1f; 认识Elasticsearch Elasticsearch的官方网站如下 Elasticsearch官网 Ela…