2024年华为OD机试的最新E卷题库(包含C卷、D卷和E卷)涵盖了多种编程语言,包括Java、Python和C++。随着技术的进步和行业需求的变化,这些题库不仅考察了基本的数据结构和算法知识,还注重实际的编码能力以及编程的思维方式。在此,我将分析几个常见的类型题目,并提供相应的代码示例。

一、数组与字符串处理

在编程中,数组和字符串是非常基本且重要的数据结构。常见的题型包括寻找数组中的最大值、最小值、字符串反转等。

示例题目:给定一个整数数组,找出其中最长的递增子序列的长度。

Python代码示例:

def length_of_lis(nums):
    if not nums:
        return 0

    dp = [1] * len(nums)  # 初始化DP数组
    for i in range(1, len(nums)):
        for j in range(i):
            if nums[i] > nums[j]:
                dp[i] = max(dp[i], dp[j] + 1)
    return max(dp)

# 测试
nums = [10, 9, 2, 5, 3, 7, 101, 18]
print(length_of_lis(nums))  # 输出 4

二、图算法

图算法是计算机科学中的一个重要领域,深受数据结构的影响。在华为的机试中,能够熟练运用图的遍历(如深度优先搜索DFS和广度优先搜索BFS)是非常必要的。

示例题目:给定一个无向图,判断是否存在环。

Java代码示例:

import java.util.*;

public class Solution {
    public boolean hasCycle(int numCourses, int[][] prerequisites) {
        List<List<Integer>> graph = new ArrayList<>();
        for (int i = 0; i < numCourses; i++) {
            graph.add(new ArrayList<>());
        }
        int[] indegree = new int[numCourses];
        for (int[] pre : prerequisites) {
            graph.get(pre[1]).add(pre[0]);
            indegree[pre[0]]++;
        }

        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < numCourses; i++) {
            if (indegree[i] == 0) {
                queue.offer(i);
            }
        }

        int count = 0;
        while (!queue.isEmpty()) {
            int node = queue.poll();
            count++;
            for (int neighbor : graph.get(node)) {
                indegree[neighbor]--;
                if (indegree[neighbor] == 0) {
                    queue.offer(neighbor);
                }
            }
        }
        return count != numCourses;  // 如果存在环
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int[][] prerequisites = {{1, 0}, {0, 1}};
        System.out.println(solution.hasCycle(2, prerequisites));  // 输出 true
    }
}

三、动态规划

动态规划是解决最优子结构问题的重要工具。在机试中,围绕动态规划的题目也相对常见。

示例题目:给定一个整数数组,计算能从数组中选出最多多少个非相邻元素,使得这些元素的和最大。

C++代码示例:

#include <iostream>
#include <vector>
using namespace std;

int rob(vector<int>& nums) {
    int n = nums.size();
    if (n == 0) return 0;
    if (n == 1) return nums[0];

    vector<int> dp(n);
    dp[0] = nums[0];
    dp[1] = max(nums[0], nums[1]);

    for (int i = 2; i < n; i++) {
        dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
    }
    return dp[n - 1];
}

int main() {
    vector<int> nums = {2, 7, 9, 3, 1};
    cout << rob(nums) << endl;  // 输出 12
    return 0;
}

总结

通过上述示例,可以看出,2024华为OD机试的题库不仅考察了基本的编程技能,还提升了学生的算法思维和问题解决能力。熟悉常见的数据结构和算法,掌握不同编程语言的实现方式,将有助于在实际的机试中取得更好的成绩。建议广大考生在备考期间,多进行练习,多思考不同题型的解决方案,从而在比赛中游刃有余。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部