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

【华为OD机考】华为OD笔试真题解析(1)--AI处理器组合

一、题目描述

某公司研发了一款高性能AI处理器,每台物理设备具备8颗AI处理器,编号分别为0、1、2、3、4、5、6、7。

编号0~3的处理器处于同一链路中,编号4~7的处理器处于另外一个链路中,不同链路中的处理器不能通信,如下图所示。

现给定服务器可用的处理器编号数组array,以及任务申请的处理器数量num,找出符合下列亲和性调度原则的芯片组合,如果不存在符合要求的组合,则返回空列表。

亲和性调度原则:

  • 如果申请处理器个数为1,则选择同一链路,剩余可用的处理器数量为1个的最佳,其次是剩余3个的为次佳,然后是剩余2个,最后是剩余4个。
  • 如果申请处理器个数为2,则选择同一链路剩余可用的处理器2个的为最佳,其余是剩余4个,最后是剩余3个。
  • 如果申请处理器个数为4,则必须选择同一链路剩余可用的处理器数量为4个。
  • 如果申请处理器个数为8,则申请节点所有8个处理器。

提示:

  1. 任务申请的处理器数量只能是1、2、4、8。
  2. 编号0~3的处理器处于一个链路,编号4~7的处理器处于另外一个链路。
  3. 处理器编号唯一,且不存在相同编号处理器。

二、输入描述

输入包含可用的处理器编号数组array,以及任务申请的处理器数量num两个部分。
第一行为array,第二行为num。例如:

[0, 1, 4, 5, 6, 7]
1

表示当前编号为0、1、4、5、6、7的处理器可用。任务申请1个处理器

数据范围:

0 <= array.length <= 8
0 <= array[i] <= 7
num in [1, 2, 4, 8]

三、输出描述

输出为组合列表,当array=[0,1,4,5,6,7]、num=1时,输出为[[0], [1]]

四、示例描述

1.示例一

输入:

[0, 1, 4, 5, 6, 7]
1

输出:

[[0], [1]]

说明:
根据第一条亲和性调度原则,在剩余两个处理器的链路(0,1,2,3)中选择处理器。由于只有0和1可用,则返回任意一颗处理器即可。

2.示例二

输入:

[0, 1, 4, 5, 6, 7]
4

输出:

[[4, 5, 6, 7]]

说明:
根据第三条亲和性调度原则,必须选择同一链路剩余可用的处理器数量为4个的环。

五、解题思路

  1. 将输入的数组分成两组,第一组数字小于4,第二组数字大于4
  2. 列出相关逻辑
    • num为1时,根据题意传入优先级[1,3,2,4],遍历优先级,返回子序列列表
    • num为2时,根据题意传入优先级[2, 4, 3],考虑到排列组合,使用python内置的itertools包中的combinations函数,获取子序列之后,整理成list格式返回结果列表
    • num为4时,根据题意如果有一组数字满足条件,返回该组的所有处理器编号
    • num为8时,根据题意如果两组数字都满足条件,返回所有处理器编号

六、解题代码

from itertools import combinationsdef solve_method(arr, num):# 根据条件将数组分为 first 和 second 两部分first = [n for n in arr if n < 4]second = [n for n in arr if n >= 4]first_nums = len(first)second_nums = len(second)result = []# 根据 `num` 值来选择调用不同的函数if num == 1:result.extend(cpu1(first, first_nums, second, second_nums))elif num == 2:result.extend(cpu2(first, first_nums, second, second_nums))elif num == 4:if first_nums == 4:result.append([n for n in range(4)])if second_nums == 4:result.append([n for n in range(4, 8)])elif num == 8:if first_nums == 4 and second_nums == 4:result.append([n for n in range(8)])return resultdef cpuN(first, first_nums, second, second_nums, priority, k) -> list:# 生成组合,优先级由 priority 控制cpus = []is_fit = Falsefor p in priority:if p == first_nums:cpus.extend([list(n) for n in combinations(first, k)])is_fit = Trueif p == second_nums:cpus.extend([list(n) for n in combinations(second, k)])is_fit = Trueif is_fit:breakreturn cpusdef cpu1(first, first_nums, second, second_nums) -> list:# cpu1 调用 cpuN 进行组合计算return cpuN(first, first_nums, second, second_nums, [1, 3, 2, 4], 1)def cpu2(first, first_nums, second, second_nums) -> list:# cpu2 调用 cpuN 进行组合计算return cpuN(first, first_nums, second, second_nums, [2, 4, 3], 2)if __name__ == '__main__':# 测试用例验证assert solve_method([0, 1, 4, 5, 6, 7], 4) == [[4, 5, 6, 7]]assert solve_method([0, 1, 4, 5, 6, 7], 1) == [[0], [1]]assert solve_method([0, 1, 2, 4, 5], 2) == [[0, 1], [0, 2], [1, 2], [4, 5], [4, 6], [5, 6]]
http://www.lryc.cn/news/532348.html

相关文章:

  • edu小程序挖掘严重支付逻辑漏洞
  • 力扣 279. 完全平方数
  • 鸿蒙生态潮起:开发者的逐浪之旅
  • Diskgenius系统迁移之后无法使用USB启动
  • Kafka 可靠性探究—副本刨析
  • 我的博文天地测试报告
  • EtherCAT主站IGH-- 35 -- IGH之pdo_list.h/c文件解析
  • 嵌入式开发神器:Buildroot的介绍和使用方法
  • JavaScript系列(61)--边缘计算应用开发详解
  • 【LeetCode】day15 142.环形链表II
  • 代理对象与目标对象
  • 【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信
  • DNN(深度神经网络)近似 Lyapunov 函数
  • 128陷阱
  • PromptSource和LangChain哪个更好
  • 构成正方形的数量:算法深度剖析与实践
  • Redis持久化-秒杀系统设计
  • 音视频入门基础:RTP专题(8)——使用Wireshark分析RTP
  • OpenAI 实战进阶教程 - 第六节: OpenAI 与爬虫集成实现任务自动化
  • SpringUI Web高端动态交互元件库
  • 解密企业安全密码:密钥管理服务如何重塑数据保护?
  • 基于keepalived+GTID半同步主从复制的高可用MySQL集群
  • 图片PDF区域信息批量提取至Excel,基于QT和阿里云api的实现方案
  • Java 大视界 -- Java 大数据在智能教育中的应用与个性化学习(75)
  • 从零手写Spring IoC容器(二):bean的定义与注册
  • 《大模型面试宝典》(2025版) 发布了
  • AWS门店人流量数据分析项目的设计与实现
  • 出租车特殊计费表算法解析与实现
  • 文档解析技术:如何高效提取PDF扫描件中的文字与表格信息?
  • 【2】高并发导出场景下,服务器性能瓶颈优化方案-异步导出