华为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. 每个列表会保证元素数量满足窗口要求,不需要考虑元素不足情况
  2. 每个列表的元素已去重,不需要考虑元素重复情况
  3. 每个列表的元素列表均不为空,不需要考虑列表为空的情况
  4. 每个列表的元素列表已经过排序处理,输出结果要保证不改变同一个列表的元素顺序
  5. 每个列表的元素数量可能是不同的

四、测试用例

测试用例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、具体步骤:

  1. 读取窗口数量 N 和每个窗口需要的元素数量 K。接着读取多个列表,每个列表包含已排序的整数。
  2. 使用一个二维列表来存储输入的每个列表。每个列表使用 LinkedList 以便于从列表头部快速删除元素。
  3. 创建一个一维数组 windows,大小为 N * K,用于存储所有窗口的元素。
  4. 使用一个指针 idx 表示当前正在分配元素的位置,以及一个指针 level 表示当前从哪个列表中取元素。
  5. 使用一个循环,直到所有窗口都填满:
    • 对于每一轮分配,轮询当前列表,将其前 N 个元素依次分配给 N 个窗口。
    • 如果当前列表的元素不够 N 个,或者被取空,则切换到下一个列表进行分配。
  6. 每轮次需要检查列表是否为空,如果为空则移除,以防止越界。
  7. 按照窗口的列顺序进行输出,将每个窗口的元素按列拼接成最终的结果。

主要使用了轮询遍历法。每次从当前列表中为每个窗口分配一个元素,然后切换到下一个列表。这样可以确保元素被均匀分布在各个窗口中。

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在线答疑。

在这里插入图片描述

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

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

相关文章

气压测试实验(用IIC)

I2C: 如果没有I2c这类总线&#xff0c;连接方法可能会如下图&#xff1a; 单片机所有的通讯协议&#xff0c;无非是建立在引脚&#xff08;高低电平的变换高低电平持续的时间&#xff09;这二者的组合上&#xff0c;i2c 多了一个clock线&#xff0c;负责为数据传输打节拍。 (i2…

同时拥有独显和核显,怎么让应用程序选择使用哪个GPU?

看你现在使用的是核显还是独显 勾选上GPU引擎选项&#xff0c;后面便会标识你所使用的是哪种显卡&#xff0c;如果是独立显卡&#xff0c;就可以免去后续的操作&#xff1b;如果不是&#xff0c;那么请继续接下来的操作。 将你需要使用独显的程序换成gpu1&#xff08;独显&am…

佰朔资本:未来钢铁行业产业格局有望稳中趋好

组织指出&#xff0c;未来钢铁作业工业格式有望稳中趋好&#xff0c;叠加当时部分公司已经处于价值小看区域&#xff0c;现阶段仍具结构性出资机会&#xff0c;尤其是拥有较高毛利率水平的优特钢企业和本钱管控力度强、具有规划效应的龙头钢企&#xff0c;未来存在估值修改的机…

JavaEE:文件操作

文章目录 文件操作和IO文件系统操作File介绍属性构造方法方法 代码演示前四个listmkdirrenameTo 文件操作和IO 文件系统操作 创建文件,删除文件,创建目录,重命名… Java中有一个类,可以帮我们完成上述操作. 这个类叫做File类. File介绍 属性 这个表格描述了文件路径的分隔符…

应急响应实战---是谁修改了我的密码?

前言&#xff1a;此次应急响应为真实案例&#xff0c;客户反馈无法通过密码登录服务器&#xff0c;疑似服务器被入侵 0x01 如何找回密码&#xff1f; 客户服务器为windows server2019&#xff0c;运维平台为PVE平台&#xff1b;实际上无论是windows系统或者是linux系统&#…

个人学习笔记7-5:动手学深度学习pytorch版-李沐

#人工智能# #深度学习# #语义分割# #计算机视觉# #神经网络# 计算机视觉 13.10 转置卷积 例如&#xff0c;卷积层和汇聚层&#xff0c;通常会减少下采样输入图像的空间维度&#xff08;高和宽&#xff09;。然而如果输入和输出图像的空间维度相同&#xff0c;在以像素级分类…

【物联网技术大作业】设计一个智能家居的应用场景

前言&#xff1a; 本人的物联网技术的期末大作业&#xff0c;希望对你有帮助。 目录 大作业设计题 &#xff08;1&#xff09;智能家居的概述。 &#xff08;2&#xff09;介绍智能家居应用。要求至少5个方面的应用&#xff0c;包括每个应用所采用的设备&#xff0c;性能&am…

2023级JavaScript与jQuery

第三课&#xff1a;JavaScript对象编程 一.预习笔记 1.Date对象 对象创建&#xff1a;var myDatenew Date() 输出显示当前日期的标准时间 对象创建&#xff1a;var myDatenew Date(“2024/09/14”) 对象创建&#xff1a;var myDatenew Date(2024,9,14) 当前对象创建时&…

TiDB从0到1学习笔记(精华篇)

历时四个月&#xff0c;恭喜赵老师的《TiDB从0到1》 系列文章顺利完结&#xff0c;小编再次梳理一遍文稿&#xff0c;并附注解分享给大家。 整体架构 从 TiDB 1.0 到 8.0&#xff0c;TiDB 的体系结构一直在不断演进。接下来让我们一起看看整体架构的变化。 TiDB v1 TiDB v1&…

Windows 环境下 vscode 配置 C/C++ 环境

vscode Visual Studio Code&#xff08;简称 VSCode&#xff09;是一个由微软开发的免费、开源的代码编辑器。它支持多种编程语言&#xff0c;并提供了代码高亮、智能代码补全、代码重构、调试等功能&#xff0c;非常适合开发者使用。VSCode 通过安装扩展&#xff08;Extension…

node.js实现阿里云短信发送

效果图 实现 一、准备工作 1、官网直达网址&#xff1a; 阿里云 - 短信服务 2、按照首页提示依次完成相应资质认证和短信模板审核&#xff1b; 3、获取你的accessKeySecret和accessKeyId&#xff1b; 方法如下&#xff1a; 获取AccessKey-阿里云帮助中心 4、获取SignNa…

【LabVIEW学习篇 - 24】:生产者/消费者设计模式

文章目录 生产者/消费者设计模式案例&#xff1a;控制LED等亮灭 生产者/消费者设计模式 生产者/消费者是多线程编程中最基本的一种模式&#xff0c;使用非常普遍。从软件角度看&#xff0c;生产者就是数据的提供方&#xff0c;而消费者就是数据的消费处理方&#xff0c;二者之…

微信小程序开发——比较两个数字大小

在这里我们使用的工具是 需要自行安装和配置。 在微信小程序中比较两个数字大小有以下几种方式&#xff1a; 一、普通条件判断 在小程序的.js 文件中&#xff0c;先定义两个数字&#xff0c;如let num1 5; let num2 3;。通过if - else if - else语句&#xff0c;根据num1与…

文件管理系统DCC与泛微OA系统集成案例

一、项目背景 上海某半导体有限公司主要产品应用于图像传感器、 图像信号处理芯片、 低功耗芯片、 射频芯片等。 公司内部有DCC文件管理系统和OA系统&#xff0c;由SAP PO平台进行中间管理&#xff0c;DCC系统对接泛微OA系统推送文件等操作&#xff0c;提高公司内部各自系统…

智能智造和工业软件研发平台SCSAI功能介绍

用爱编程30年&#xff0c;倾心打造工业和智能智造软件研发平台SCIOT,用创新的方案、大幅的让利和极致的营销&#xff0c;致力于为10000家的中小企业实现数字化转型&#xff0c;打造数字化企业和智能工厂&#xff0c;点击上边蓝色字体&#xff0c;关注“AI智造AI编程”或文末扫码…

lightdm , xrandr , startx 桌面管理器,窗口管理器

问题&#xff1a; 了解这几个的含义。 显示服务器 这个不是很明白 显示管理器&#xff0c; 知道就行了&#xff0c;也不是很明白。 窗口管理器。 桌面管理器。 这个其实就是 桌面环境了&#xff0c; 我们的板卡上使用的是xface 。 这个 xface 是一个集合&#xff0c;这里面…

亚马逊IP关联及其解决方案

在电子商务领域&#xff0c;亚马逊作为全球领先的在线购物平台&#xff0c;吸引了众多商家和个人的参与。然而&#xff0c;随着业务规模的扩大&#xff0c;商家在使用亚马逊服务时可能会遇到IP关联的问题&#xff0c;这不仅影响账户的正常运营&#xff0c;还可能带来一系列不利…

基于SpringBoot+Vue的个性化视频推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

ComfyUI安装节点过程中被降低了版本的软件包重新安装

最近在安装2个没怎么及时更新节点时&#xff0c;安装节点依赖性过程中&#xff0c;将原高版本的软件包&#xff0c;给降到了低版本&#xff0c;解决的办法就是&#xff1a;1、再次删除软件包&#xff0c;2、指定版本号重新安装回高版本软件包。

Centos7.9部署Gitlab-ce-16.9

一、环境信息 软件/系统名称版本下载地址备注Centos77.9.2009https://mirrors.nju.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.isogitlab-cegitlab-ce-16.9.1https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.9.1-ce.0.el7.x86_64.rpm…