华为OD机试 - 推荐多样性(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
推荐多样性需要从多个列表中选择元素,一次性要返回 N 屏数据(窗口数量),每屏展示 K 个元素(窗口大小),选择策略:
各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一个元素,再从第二个列表中为每屏选择一个元素,依次类推。
每个列表的元素尽量均分为 N 份,如果不够 N 份,也要全部分配完,参考样例图:
(1) 从第一个列表中选择 4 条 0123,分别放到 4 个窗口中
(2) 从第二个列表中选择 4 条 10111213,分别放到 4 个窗口中
(3) 从第三个列表中选择 4 条 20212223,分别放到 4 个窗口中
(4) 再从第一个列表中选择 4 条 4567,分别放到 4 个窗口中
…
(5) 再从第一个列表中选择,由于数量不足 4 条,取剩下的 2 条,放到窗口1 和窗口2
(6) 再从第二个列表中选择,由于数量不足 4 条且总的元素数达到窗口要求,取 1819 放到窗口3 和窗口4
二、输入描述
第一行输入为 N,表示需要输出的窗口数量,取值范围 [1, 10]
第二行输入为 K,表示每个窗口需要的 元素数量,取值范围 [1, 100]
之后的行数不定(行数取值范围 [1, 10]),表示每个列表输出的元素列表。元素之间以空格隔开,已经过排序处理,每个列表输出的元素数量取值范围 [1, 100]
三、输出描述
输出元素列表,元素数量 = 窗口数量 * 窗口大小,元素之间以空格分隔,多个窗口合并为一个列表输出,参考样例:
先输出窗口1的元素列表,再输出窗口2的元素列表,再输出窗口3的元素列表,最后输出窗口4的元素列表。
备注
- 每个列表会保证元素数量满足窗口要求,不需要考虑元素不足情况
- 每个列表的元素已去重,不需要考虑元素重复情况
- 每个列表的元素列表均不为空,不需要考虑列表为空的情况
- 每个列表的元素列表已经过排序处理,输出结果要保证不改变同一个列表的元素顺序
- 每个列表的元素数量可能是不同的
四、测试用例
测试用例1:
1、输入
4
7
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
2、输出
0 10 20 4 14 24 8 1 11 21 5 15 25 9 2 12 22 6 16 26 18 3 13 23 7 17 27 19
3、说明
测试用例2:
1、输入
2
3
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
2、输出
0 10 20 1 11 21
3、说明
五、解题思路
1、问题分析
问题要求我们从多个排序好的列表中选择元素,以 “轮询” 的方式将元素分配到多个窗口中。每个窗口的展示数量固定,窗口数量也固定。主要目标是通过轮询方式选择元素,确保列表中的元素尽量平均分布到各个窗口中,同时保持列表中元素的顺序不变。
2、ArrayList + LinkedList
使用 ArrayList 存储每个输入列表,每个输入列表使用 LinkedList 来存储元素。
选择 LinkedList 的原因是它可以高效地在列表头部移除元素(removeFirst 操作的时间复杂度为 O(1)),这在轮询分配元素时非常重要。
3、具体步骤:
- 读取窗口数量 N 和每个窗口需要的元素数量 K。接着读取多个列表,每个列表包含已排序的整数。
- 使用一个二维列表来存储输入的每个列表。每个列表使用 LinkedList 以便于从列表头部快速删除元素。
- 创建一个一维数组 windows,大小为 N * K,用于存储所有窗口的元素。
- 使用一个指针 idx 表示当前正在分配元素的位置,以及一个指针 level 表示当前从哪个列表中取元素。
- 使用一个循环,直到所有窗口都填满:
- 对于每一轮分配,轮询当前列表,将其前 N 个元素依次分配给 N 个窗口。
- 如果当前列表的元素不够 N 个,或者被取空,则切换到下一个列表进行分配。
- 每轮次需要检查列表是否为空,如果为空则移除,以防止越界。
- 按照窗口的列顺序进行输出,将每个窗口的元素按列拼接成最终的结果。
主要使用了轮询遍历法。每次从当前列表中为每个窗口分配一个元素,然后切换到下一个列表。这样可以确保元素被均匀分布在各个窗口中。
4、时间复杂度
总时间复杂度为 O(N * K),其中 N 是窗口数量,K 是每个窗口的元素数量。主要耗时在于分配元素和输出结果的过程中。
六、Python算法源码
def main():import sysinput = sys.stdin.readdata = input().splitlines()# 读取窗口数量和每个窗口的元素数量n = int(data[0])k = int(data[1])# 读取输入的所有列表lists = []for line in data[2:]:if line.strip() == '': # 本地测试时,以空行作为输入截止条件breaknums = list(map(int, line.split()))lists.append(nums)# 初始化窗口矩阵为一维数组windows = [0] * (k * n)# 当前正在为窗口矩阵赋值的索引位置idx = 0# 当前从第level个列表中取值level = 0# 当窗口矩阵填满后,结束循环while idx < len(windows):# 当前轮次是否发生了"借"动作flag = False# 从当前列表中取前 n 个元素for i in range(n):windows[idx] = lists[level].pop(0)idx += 1# 如果当前列表没有元素了,则继续切到下一个列表中"借"if len(lists[level]) == 0 and len(lists) > 1:lists.pop(level) # 删除空列表level %= len(lists) # 防止越界flag = True # 发生了"借"动作# 如果没有发生"借"动作,则切换到下一个列表if not flag:level = (level + 1) % len(lists) # 防止越界# 构建输出result = []# 遍历窗口矩阵的每一列for j in range(n): # 遍历列号for i in range(k): # 遍历行号result.append(str(windows[i * n + j])) # 将每一列的元素进行拼接print(' '.join(result))if __name__ == "__main__":main()
七、JavaScript算法源码
function main() {const fs = require('fs');// 读取输入const input = fs.readFileSync('/dev/stdin', 'utf8').split('\n');// 读取窗口数量和每个窗口的元素数量const n = parseInt(input[0]);const k = parseInt(input[1]);// 读取输入的所有列表let lists = [];for (let i = 2; i < input.length; i++) {const line = input[i].trim();if (line === '') break; // 本地测试时,以空行作为输入截止条件let nums = line.split(' ').map(Number);lists.push(nums);}// 初始化窗口矩阵为一维数组let windows = new Array(k * n);// 当前正在为窗口矩阵赋值的索引位置let idx = 0;// 当前从第 level 个列表中取值let level = 0;// 当窗口矩阵填满后,结束循环while (idx < windows.length) {// 当前轮次是否发生了"借"动作let flag = false;// 从当前列表中取前 n 个元素for (let i = 0; i < n; i++) {windows[idx++] = lists[level].shift();// 如果当前列表没有元素了,则继续切到下一个列表中"借"if (lists[level].length === 0 && lists.length > 1) {lists.splice(level, 1); // 删除空列表level %= lists.length; // 防止越界flag = true; // 发生了"借"动作}}// 如果没有发生"借"动作,则切换到下一个列表if (!flag) {level = (level + 1) % lists.length; // 防止越界}}// 构建输出let result = [];// 遍历窗口矩阵的每一列for (let j = 0; j < n; j++) { // 遍历列号for (let i = 0; i < k; i++) { // 遍历行号result.push(windows[i * n + j]); // 将每一列的元素进行拼接}}console.log(result.join(' '));
}main();
八、C算法源码
#include <stdio.h>
#include <stdlib.h>// 辅助函数:读取一行输入
char* read_line() {char* line = NULL;size_t len = 0;getline(&line, &len, stdin);return line;
}// 辅助函数:将字符串按空格分割并转换为整数数组
int* parse_integers(char* line, int* size) {int* nums = malloc(100 * sizeof(int)); // 假设每行最多有100个数字*size = 0;char* token = strtok(line, " ");while (token != NULL) {nums[(*size)++] = atoi(token);token = strtok(NULL, " ");}return nums;
}int main() {// 读取窗口数量和每个窗口的元素数量int n, k;scanf("%d", &n);scanf("%d", &k);getchar(); // 读取换行符// 存储所有的列表int** lists = malloc(10 * sizeof(int*)); // 最多有10个列表int list_sizes[10] = {0};int list_count = 0;while (1) {char* line = read_line();if (line[0] == '\n' || line[0] == '\0') {free(line);break;}lists[list_count] = parse_integers(line, &list_sizes[list_count]);list_count++;free(line);}// 初始化窗口矩阵为一维数组int* windows = malloc(k * n * sizeof(int));int idx = 0;int level = 0;// 当窗口矩阵填满后,结束循环while (idx < k * n) {int flag = 0;for (int i = 0; i < n; i++) {windows[idx++] = lists[level][0];// 移除第一个元素for (int j = 0; j < list_sizes[level] - 1; j++) {lists[level][j] = lists[level][j + 1];}list_sizes[level]--;// 如果当前列表没有元素了,则继续切到下一个列表中"借"if (list_sizes[level] == 0 && list_count > 1) {free(lists[level]); // 删除空列表for (int j = level; j < list_count - 1; j++) {lists[j] = lists[j + 1];list_sizes[j] = list_sizes[j + 1];}list_count--;level %= list_count; // 防止越界flag = 1;}}// 如果没有发生"借"动作,则切换到下一个列表if (!flag) {level = (level + 1) % list_count; // 防止越界}}// 构建输出for (int j = 0; j < n; j++) {for (int i = 0; i < k; i++) {printf("%d ", windows[i * n + j]);}}printf("\n");// 释放内存free(windows);for (int i = 0; i < list_count; i++) {free(lists[i]);}free(lists);return 0;
}
九、C++算法源码
#include <iostream>
#include <vector>
#include <queue>
#include <sstream>
using namespace std;int main() {int n, k;cin >> n >> k;cin.ignore(); // 读取换行符vector<queue<int>> lists;string line;// 读取输入的所有列表while (getline(cin, line)) {if (line.empty()) break; // 本地测试时,以空行作为输入截止条件istringstream iss(line);queue<int> q;int num;while (iss >> num) {q.push(num);}lists.push_back(q);}// 初始化窗口矩阵为一维数组vector<int> windows(k * n);// 当前正在为窗口矩阵赋值的索引位置int idx = 0;// 当前从第 level 个列表中取值int level = 0;// 当窗口矩阵填满后,结束循环while (idx < windows.size()) {// 当前轮次是否发生了"
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

相关文章:
华为OD机试 - 推荐多样性(Python/JS/C/C++ 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…...
梧桐数据库(WuTongDB):CBO(Cost-Based Optimizer)基于代价的优化器技术简介
CBO(基于代价的优化器,Cost-Based Optimizer)是现代数据库系统中最广泛使用的查询优化器之一。它通过计算执行查询时可能消耗的资源(如CPU、内存、I/O)来选择最优的执行计划,以提高查询性能。 1. CBO 的工…...
深入探索Go语言中的函数:匿名函数、指针参数与函数返回
1. Go语言中的函数 函数是任何编程语言中的核心元素,它们帮助我们将大型程序分解为更小的、易于管理的部分。在Go语言中,函数是通过 func 关键字定义的。理想的函数应当是独立的,完成单一任务。如果你发现某个函数正在执行多个任务ÿ…...
Android12_13左上角状态栏数字时间显示右移动
文章目录 问题场景解决问题 一、基础资料二、代码追踪三、解决方案布局的角度解决更改paddingStart 的默认值设置marginLeft 值 硬编码的角度解决 问题场景 1)早期一般屏幕都是方形的,但是曲面屏,比如:好多车机Android产品、魔镜…...
望繁信科技携流程智能解决方案亮相CNDS 2024新能源产业数智峰会
9月13日,CNDS 2024中国新能源产业数智峰会在北京圆满落幕。本次峰会以“走向数字新能源”为主题,汇聚了来自新能源领域的顶尖领袖、专家学者及知名企业代表,共同探讨数字化技术在新能源行业中的创新应用和发展趋势。上海望繁信科技有限公司&a…...
nginx负载均衡(轮询与权重)
文章目录 1. nginx的介绍2. nginx使用场景3. nginx在windows的下载与安装4. nginx的简单使用5. nginx进行轮询测试6. nginx进行权重测试7. 总结 1. nginx的介绍 Nginx(engine x)是一个高性能的HTTP和反向代理web服务器,同时也是一个开源的、…...
【计算机网络】网络通信中的端口号
文章目录 一、引入端口号二、端口号的作用三、端口号的确定 在TCP/IP协议中,传输层有两个重要的协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP用于提供可靠的数据传输,而UDP则适合用于广播…...
Python 解析 JSON 数据
1、有如下 JSON 数据,存放在 data.json 文件: [{"id":1, "name": "小王", "gender": "male", "score": 96.8}, {"id":2, "name": "小婷", "gender&qu…...
利用LlamaIndex构建ARG本地知识库
文章目录 1. 环境准备2. 启用诊断日志3. 配置本地模型4. 配置本地向量模型5. LlamaIndex全局配置6. 创建 PGVectorStore7. 从数据库加载数据8. 文本分割器: SpacyTextSplitter9. 配置管道10. 创建向量存储索引11 .指定响应模式,以及启用流式响应 在现代的人工智能应…...
PCM的缺点
PCM的主要缺点包括需要较大的数据传输带宽和存储空间,导致无法实现高压缩比,相对较低的数据压缩效率。 PCM(脉冲编码调制)作为一种无损编码技术,虽然能够保留原始信号的完整性,适用于需要高保…...
【C语言】(指针系列四)回调函数+qsort函数
一、回调函数 回调函数就是通过函数指针调用的函数 如果你把函数的指针作为参数传递给另外一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数并不是一个单一的函数实现的,而是在某种情况下,编…...
全面理解tensor编程中矩阵的行和列
经常会在编程中遇到理解矩阵行和列的事情。 1、要明确无论这个张量有多少维度,它的矩阵乘法都只能作用于最后两个维度。 例如: import torcha torch.rand([64, 32, 3, 4]) b torch.rand([64, 32, 3, 4])c torch.matmul(a, b.transpose(2, 3)) # 交…...
【Kubernetes】常见面试题汇总(十)
目录 29.简述 Kubernetes 自动扩容机制? 30.简述 Kubernetes Service 类型? 31.简述 Kubernetes Service 分发后端的策略? 32.简述 Kubernetes Headless Service ? 29.简述 Kubernetes 自动扩容机制? (…...
CSS —— 界面布局
flexbox - 弹性盒子布局(弹性布局) 一维方向,横纵向排列。 采用flex布局的元素,称为 Flex 容器(flex container),简称"容器" flex-direction 用于设置主轴方向;子元素默…...
SpringBoot万级并发-jemeter-Address already in use: connect
一、场景 用Jmeter压力单测接口的时候,发现报 Response code:Non HTTP response code: java.net.BindException Response message:Non HTTP response message: Address already in use: connect 然后我这边是wondows的电脑操作压测的,操作系统win10&…...
P1228 地毯填补问题
 #include<bits/stdc.h> using namespace std; #define qw dfs(zxl-1,zyl-1,zx,zy,l); #define we dfs(zxl-1,zyl,zx,zyl,l); #define er dfs(zxl,zyl-1,zxl,zy,l); #define rt dfs(zxl,zyl,zxl,zyl,l);void dfs(int x,int y,int zx,int zy,int…...
【计算机网络】UDP TCP介绍
UDP & TCP介绍 UDP报文格式报文内容介绍端口号报文长度校验和载荷 TCP报文格式初步了解TCP机制确认应答超时重传连接管理滑动窗口流量控制拥塞控制紧急传输数据推送延时应答捎带应答面向字节流异常处理心跳机制 UDP 和 TCP 的区别 UDP 报文格式 对于网络协议, 本质上就是…...
JDBC初相识
文章目录 JDBC的由来JDBC的好处 JDBC核心API的介绍JDBC会用到的包JDBC四个核心对象JDBC访问数据库的步骤 客户端操作MySQL数据库的方式 使用第三方客户端来访问MySQL:SQLyog、Navicat 使用MySQL自带的命令行方式 通过Java来访问MySQL数据库,今天要学习…...
Go语言现代web开发07 map字典
Maps are complex data types used to store key-value pairs. Each key can appear only once on the map and can be used to find the value paired with that key. The default value for the map is nil. A nil map has no keys and keys cannot be added. 映射是用于存储…...
AI工具一键制作爆火的“汉语新解“卡片!
最近出现了一种很火的新玩法“汉语新解”。 AI把一个词汇,以一种特殊的视角,用幽默、讽刺等方式重新定义,然后生成一张精美的卡片。 这个玩法和之前我发的的吐槽工具玩法类似,主打的就是一个新颖、情绪释放。 今天教大家怎么快速…...
第8篇 | 逻辑回归
逻辑回归虽然名字中包含"回归",但实际上是一种分类算法。它通过sigmoid函数将线性输出转换为概率,广泛用于二分类问题。本篇将详细介绍逻辑回归的原理、实现和应用。一、逻辑回归概述逻辑回归用于处理二分类问题,输出为样本属于某一…...
STM32从入门到实战:两周速成指南
STM32快速入门指南:从零基础到项目实战1. 项目概述1.1 STM32与8051的对比分析对于已经掌握8051和C语言的开发者而言,STM32的学习曲线并不陡峭。关键在于理解何时需要从8051迁移到STM32平台:计算能力需求:当8051的主频无法满足复杂…...
UNIX文件系统设计:一切皆文件的原理与实践
UNIX 文件系统设计哲学:一切皆文件的深度解析1. 核心设计理念1.1 统一I/O抽象模型UNIX系统最核心的设计原则是提供访问各类输入/输出资源的统一范式。系统将所有I/O资源抽象为"文件"对象,通过同一套API接口暴露给用户空间。这种设计使得开发者…...
4大核心能力赋能企业级视频资源管理:抖音批量下载工具的技术实现与商业价值
4大核心能力赋能企业级视频资源管理:抖音批量下载工具的技术实现与商业价值 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字化内容爆发的时代,企业级视频资源管理面临着效率与成…...
OpenClaw多模型切换技巧:GLM-4.7-Flash与Qwen3-32B混合调用实战
OpenClaw多模型切换技巧:GLM-4.7-Flash与Qwen3-32B混合调用实战 1. 为什么需要多模型切换 去年冬天,当我第一次尝试用OpenClaw自动处理周报时,发现一个有趣的现象:用同一个模型处理文本摘要和代码片段时,效果差异很大…...
ADS 2025瞬态仿真实战:手把手教你搞定PCB微带线串扰分析(含变量单位避坑指南)
ADS 2025瞬态仿真实战:手把手教你搞定PCB微带线串扰分析(含变量单位避坑指南) 作为一名硬件工程师,在高速PCB设计中遇到串扰问题就像在迷宫里寻找出口——看似简单却处处暗藏陷阱。特别是当你在ADS 2025中按照教程一步步设置参数&…...
STM32F103引脚功能全解析:从供电到通信接口的实战配置指南
STM32F103引脚功能全解析:从供电到通信接口的实战配置指南 在嵌入式系统开发中,STM32F103系列微控制器因其出色的性能和丰富的外设资源,成为众多开发者的首选。这款基于ARM Cortex-M3内核的MCU,不仅具备72MHz的主频,还…...
HP-Socket创新项目原型迭代记录:变更、原因与效果
HP-Socket创新项目原型迭代记录:变更、原因与效果 【免费下载链接】HP-Socket High Performance TCP/UDP/HTTP Communication Component 项目地址: https://gitcode.com/gh_mirrors/hp/HP-Socket HP-Socket作为一款高性能TCP/UDP/HTTP通信组件,其…...
新手也能懂的RAIM算法:用Python复现GNSS完好性监测(附代码与数据)
新手也能懂的RAIM算法:用Python复现GNSS完好性监测(附代码与数据) 当你用手机导航时,是否想过这些定位信号有多可靠?RAIM(Receiver Autonomous Integrity Monitoring)算法就像GNSS系统的"质…...
从Safetensors到GGUF:利用llama.cpp解锁Ollama模型部署新路径
1. 为什么需要从Safetensors转换到GGUF格式 最近在魔塔社区下载了几个热门的大模型,发现都是safetensors格式的,但直接扔进Ollama里根本跑不起来。这个问题困扰了我好几天,直到发现了llama.cpp这个神器。safetensors其实是Hugging Face生态中…...
