【Py/Java/C++三种语言OD独家2024D卷真题】20天拿下华为OD笔试之【哈希表】2024D-测试用例执行计划【欧弟算法】全网注释最详细分类最全的华为OD真题题解

72 篇文章 4 订阅
51 篇文章 2 订阅

有LeetCode算法/华为OD考试扣扣交流群可加 948025485
可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题
绿色聊天软件戳 od1441了解算法冲刺训练(备注【CSDN】否则不通过)

从2024年4月15号开始,OD机考全部配置为2024D卷
注意两个关键点:

  1. 会遇到C卷复用题。虽然可能存在幸存者偏差,但肯定还会有一大部分的旧题。
  2. 现在又支持做完题目之后倒回去改了。就是可以先做200的再做100的,然后可以反复提交。
    在这里插入图片描述

题目描述与示例

题目描述

某个产品当前迭代周期内有 N 个特性(F1, F2, ..., FN)需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其 ID 作为下标进行标识。

设计了 M 个测试用例(T1, T2, ..., TN ),每个用例对应了一个覆盖特性的集合,测试用例使用其 ID 作为下标进行标识,测试用例的优先级定义为其覆盖的特性的优先级之和。

在开展测试之前,需要制定测试用例的执行顺序,规则为:优先级大的用例先执行,如果存在优先级相同的用例,用例 ID 小的先执行。

输入描述

第一行输入为 NMN 表示特性的数量,M 表示测试用例的数量,0<N<=1000<M<=100

之后 N 行表示特性 ID=1 到特性 ID=N 的优先级。

再接下来 M 行表示测试用例 ID=1 到测试用例 ID=M 关联的特性的 ID 的列表。

输出描述

按照执行顺序(优先级从大到小)输出测试用例的 ID,每行一个 ID

测试用例覆盖的 ID 不重复。

示例一

输入

5 4
1
1
2
3
5
1 2 3
1 4
3 4 5
2 3 4

输出

3
4
1
2

说明

测试用例的优先级计算如下:

T1=Pf1+Pf2+Pf3=1+1+2=4
T2=Pf1+Pf4=1+3=4
T3=Pf3+Pf4+Pf5=2+3+5=10
T4=Pf2+Pf3+Pf4=1+2+3=6

按照优先级从小到大,以及相同优先级,ID 小的先执行的规则,执行顺序为 T3,T4,T1,T2

示例二

输入

3 3
3
1
5
1 2 3
1 2 3
1 2 3

输出

1
2
3

说明

测试用例的优先级计算如下:

T1=Pf1+Pf2+Pf3=3+1+5=9
T2=Pf1+Pf2+Pf3=3+1+5=9
T3=Pf1+Pf2+Pf3=3+1+5=9

每个优先级一样,按照 ID 从小到大执行,执行顺序为 T1,T2,T3

解题思路

又是一道典型的直接看用例比看题意更容易理解的题目。

对于每一个测试用例 ID都对应一个优先级,而这个优先级的计算是若干特性的优先级的叠加。

假设所有特性对应的优先级已经储存在哈希表dic中,dic[num]表示特性num的优先级。

对于特定的测试用例,包含了若干特性的测试num1, num2, ...,这个测试用例的总优先级为dic[num1] + dic[num2] + ...

最终再进行排序和逐行输出即可。

代码

Python

# 题目:【哈希表】2023C-测试用例执行计划
# 分值:100
# 作者:许老师-闭着眼睛学数理化
# 算法:哈希表/排序
# 代码看不懂的地方,请直接在群上提问


# 输入特性个数N,测试用例个数M
N, M = map(int, input().split())
# 构建一个哈希表,用于储存每一个特性的优先级
dic = dict()
# 输入N行,key为编号i,value为该特性的优先级
for i in range(1, N+1):
    dic[i] = int(input())

# 构建答案哈希表
ans_dic = dict()
# 输入M行
for i in range(1, M+1):
    # 获得第i个测试用例对应的特性
    nums = list(map(int, input().split()))
    # 将所有特性的优先级进行求和,得到用例i的特性
    ans_dic[i] = sum(dic[num] for num in nums)


# 对所有的id根据优先级大小进行排序,先按照优先级降序排序,优先级相同再按照id大小升序排序
# 然后逐行输出
for idx in sorted(list(ans_dic.keys()), key = lambda x: (-ans_dic[x], x)):
    print(idx)

Java

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 输入特性个数N,测试用例个数M
        int N = scanner.nextInt();
        int M = scanner.nextInt();
        scanner.nextLine(); // Consume newline character

        // 构建一个哈希表,用于储存每一个特性的优先级
        Map<Integer, Integer> dic = new HashMap<>();
        // 输入N行,key为编号i,value为该特性的优先级
        for (int i = 1; i <= N; i++) {
            int priority = scanner.nextInt();
            dic.put(i, priority);
        }
        scanner.nextLine(); // Consume newline character

        // 构建答案哈希表
        Map<Integer, Integer> ansDic = new HashMap<>();
        // 输入M行
        for (int i = 1; i <= M; i++) {
            String line = scanner.nextLine();
            Scanner lineScanner = new Scanner(line);

            // 获得第i个测试用例对应的特性
            List<Integer> nums = new ArrayList<>();
            while (lineScanner.hasNextInt()) {
                int num = lineScanner.nextInt();
                nums.add(num);
            }

            // 将所有特性的优先级进行求和,得到用例i的特性
            int sum = 0;
            for (int num : nums) {
                sum += dic.get(num);
            }
            ansDic.put(i, sum);

            lineScanner.close();
        }

        // 对所有的id根据优先级大小进行排序,先按照优先级降序排序,优先级相同再按照id大小升序排序
        List<Integer> ids = new ArrayList<>(ansDic.keySet());
        Collections.sort(ids, new Comparator<Integer>() {
            @Override
            public int compare(Integer a, Integer b) {
                int diff = ansDic.get(b) - ansDic.get(a);
                return diff != 0 ? Integer.compare(diff, 0) : Integer.compare(a, b);
            }
        });

        // 然后逐行输出
        for (int idx : ids) {
            System.out.println(idx);
        }

        scanner.close();
    }
}

C++

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <sstream>

using namespace std;

int main() {
    // 输入特性个数N,测试用例个数M
    int N, M;
    cin >> N >> M;
    cin.ignore(); // Ignore the newline character after M

    // 构建一个哈希表,用于储存每一个特性的优先级
    unordered_map<int, int> dic;
    // 输入N行,key为编号i,value为该特性的优先级
    for (int i = 1; i <= N; i++) {
        int priority;
        cin >> priority;
        dic[i] = priority;
    }
    cin.ignore(); // Ignore the newline character after N

    // 构建答案哈希表
    unordered_map<int, int> ansDic;
    // 输入M行
    for (int i = 1; i <= M; i++) {
        string line;
        getline(cin, line);
        stringstream ss(line);
        
        // 获得第i个测试用例对应的特性
        vector<int> nums;
        int num;
        while (ss >> num) {
            nums.push_back(num);
        }

        // 将所有特性的优先级进行求和,得到用例i的特性
        int sum = 0;
        for (int num : nums) {
            sum += dic[num];
        }
        ansDic[i] = sum;
    }

    // 对所有的id根据优先级大小进行排序,先按照优先级降序排序,优先级相同再按照id大小升序排序
    vector<int> ids;
    for (const auto& entry : ansDic) {
        ids.push_back(entry.first);
    }
    sort(ids.begin(), ids.end(), [&](int a, int b) {
        int diff = ansDic[b] - ansDic[a];
        return diff != 0 ? diff < 0 : a < b;
    });

    // 然后逐行输出
    for (int idx : ids) {
        cout << idx << endl;
    }

    return 0;
}

时空复杂度

时间复杂度:O(NM)。在计算每一个测试用例的优先级时,需要遍历最多N个特性,一共有M个用例。

空间复杂度:O(N+M)。两个哈希表所占空间


华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务300+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录:网盘文件,永久链接 1、华为HCIE安全认证介绍及教学大纲 2、产品介绍及模拟器使用方法 3、TCP-IP网络数据通信原理 4、华为防火墙基础技术--拓扑初始化(1) 5、华为防火墙基础技术--拓扑初始化(2) 6、华为防火墙基础技术--拓扑初始化(3) 7、华为防火墙基础技术--状态检测机制与会话表结构及工作原理 8、华为防火墙基础技术--报文转发流程 9.华为防火墙基础技术--安全策略(1) 10.华为防火墙基础技术--安全策略(2) 11.华为防火墙基础技术--安全策略(3) 12.华为防火墙基础技术--ASPF技术(1) 13.华为防火墙基础技术--ASPF技术(2) 14.华为防火墙基础技术--源NAT(1) 15.华为防火墙基础技术--源NAT(2) 16.华为防火墙基础技术--源NAT(3) 17.华为防火墙上的NAT技术——源NAT双出口环境+静态服务器映射部署方案 18.华为防火墙上的NAT技术——NAT-SERVER双出口环境(源进源出)+Destination NAT 19.华为防火墙上的NAT技术——双向NAT 20.华为防火墙上的NAT技术——NAT与黑洞路由 21.华为防火墙上的NAT技术——SLB 22.华为防火墙上的高可用性技术——IP-LINK LINK-GROUP ETH-TRUNK BYPASS 23.华为防火墙上的高可用性技术——BFD 24. 防火墙双机热备基础——VRRP协议原理 25. 防火墙双机热备基础——VGMP与HRP协议原理(1) 26. 防火墙双机热备基础——VGMP与HRP协议原理(2) 27. 防火墙双机热备高级部分——部署场景与协议最佳实践(1) 28. 防火墙双机热备高级部分——部署场景与协议最佳实践(2) 29. 防火墙双机热备高级部分——部署场景与协议最佳实践(3) 30. 防火墙双机热备高级部分——部署场景与协议最佳实践(4) 31. VPN基础——GRE协议基础原理篇(协议部署、流发机制、安全策略) 32. VPN基础——GRE协议高级特性篇(动态路由部署、NAT环境、路由震荡) 33. VPN基础——加密学原理(对称与非对称加密算法、数字信封、数字签名、中间人攻击) 34. VPN基础——加密学原理(哈希函数、MAC、重放攻击、数字证书、PKI) 35. VPN基础——加密学原理之完美觖决方案 36. IPSec VPN基础——IPSec安全框架及基础配置 37. IPSec VPN——IKE协议原理工作细节及报文详解
题目描述: 给定一个整数数组nums和一个整数k,编写一个函数来判断数组中是否存在 k 个不同的索引i、j、l和m,使得nums[i] + nums[j] == nums[l] + nums[m]。如果存在,返回true;否则,返回false。 解题思路: 首先,我们可以使用4个for循环来遍历所有可能的索引组合,然后判断它们对应元素的和是否相等。但是这种方法的时间复杂度为O(n^4),显然效率很低。因此,我们可以优化思路,使用哈希表来存储数组元素的和及其对应的索引,然后遍历所有可能的组合,判断是否存在相等的和。 具体步骤: 1. 创建一个HashMap<Integer, List<int[]>>来存储和及其对应的索引组合; 2. 遍历数组nums的所有可能组合,计算两个元素的和,并将和及其对应的索引组合存入HashMap中; 3. 再次遍历数组nums,对于每个元素,查找是否存在k-1个不同的索引对应的和在HashMap中,如果存在,则返回true; 4. 遍历结束后若未找到满足条件的索引组合,则返回false。 代码实现: ```java public static boolean checkKSum(int[] nums, int k) { Map<Integer, List<int[]>> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { int sum = nums[i] + nums[j]; if (!map.containsKey(sum)) { map.put(sum, new ArrayList<>()); } map.get(sum).add(new int[]{i, j}); } } for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { int target = nums[i] + nums[j]; if (map.containsKey(target)) { List<int[]> list = map.get(target); for (int[] pair : list) { if (pair[0] != i && pair[1] != i && pair[0] != j && pair[1] != j) { return true; } } } } } return false; } ``` 以上就是对2023华为od机试真题java【k数之和】的回答,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值