(200分)- 推荐多样性(Java  JS  Python  C)
(200分)- 推荐多样性Java JS Python C题目描述推荐多样性需要从多个列表中选择元素一次性要返回 N 屏数据窗口数量每屏展示 K 个元素窗口大小选择策略各个列表元素需要做穿插处理即先从第一个列表中为每屏选择一个元素再从第二个列表中为每屏选择一个元素依次类推每个列表的元素尽量均分为 N 份如果不够 N 个也要全部分配完参考样例图1从第一个列表中选择 4 条 0 1 2 3分别放到 4 个窗口中2从第二个列表中选择 4 条 10 11 12 13分别放到 4 个窗口中3从第三个列表中选择 4 条 20 21 22 23分别放到 4 个窗口中4再从第一个列表中选择 4 条 4 5 6 7分别放到 4 个窗口中...5再从第一个列表中选择由于数量不足 4 条取剩下的 2 条放到 窗口1 和 窗口26再从第二个列表中选择由于数量不足 4 条并且总的元素数达到窗口要求取 18 19 放到 窗口3 和 窗口4输入描述第一行输入为 N表示需要输出的窗口数量取值范围 [1, 10]第二行输入为 K表示每个窗口需要的元素数量取值范围 [1, 100]之后的行数不定行数取值范围 [1, 10]表示每个列表输出的元素列表。元素之间以空格隔开已经过排序处理每个列表输出的元素数量取值范围 [1, 100]输出描述输出元素列表元素数量 窗口数量 * 窗口大小元素之间以空格分隔多个窗口合并为一个列表输出参考样例先输出窗口1的元素列表再输出窗口2的元素列表再输出窗口3的元素列表最后输出窗口4的元素列表备注每个列表会保证元素数量满足窗口要求不需要考虑元素不足情况每个列表的元素已去重不需要考虑元素重复情况每个列表的元素列表均不为空不需要考虑列表为空的情况每个列表的元素列表已经过排序处理输出结果要保证不改变同一个列表的元素顺序每个列表的元素数量可能是不同的用例输入470 1 2 3 4 5 6 7 8 910 11 12 13 14 15 16 17 18 1920 21 22 23 24 25 26 27 28 29输出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说明无题目解析我们可以将最终的窗口集当成一个矩阵windows该矩阵有 k 行 n 列矩阵的每一列对应一个窗口。最终按列打印该矩阵即为题解。之后就是根据题目给定规则往这个windos矩阵中填值即可。由于填值过程遵循从左到右、从上到下的顺序我们可以将windows矩阵转化为一维数组其长度为k*n。这样只需维护一个索引指针idx就能准确指示当前填值位置。列表集的读取规则如下从第一个列表开始每次读取n个值填入windows若当前列表剩余元素≥n读取n个值后该列表仍有剩余无需向后借元素若当前列表剩余元素n读取完该列表后需向后借元素需注意借元素的情况例如540 1 2 3 45 6 7 89 10 11 12 13 1415 16 17 18 19在填充 Windows 矩阵的第二行时由于第二个列表元素不足系统自动从第三个列表借用元素。那么在填充 Windows 矩阵的第三行时应该从列表集的第三个列表开始读取。最终生成的 Windows 矩阵如下所示在代码实现时需注意以下处理逻辑定义level指针指向当前读取轮次的列表序号无借操作时当前列表读取完成后执行level有借操作时因当前列表元素不足需在读取过程中执行level切换到下一列表借元素完成元素填充后无需再次level此时已处于下一轮要读取的列表位置优化后的表达修复了一个边界问题当执行借操作时若当前层级列表元素已耗尽需要向下一层级借用时必须确保存在下一层级列表否则将无法完成借用操作。相关代码位置如下JS第40行 Java第41行 Python第33行 C第111行JS算法源码const rl require(readline).createInterface({ input: process.stdin }); var iter rl[Symbol.asyncIterator](); const readline async () (await iter.next()).value; void (async function () { const n parseInt(await readline()); const k parseInt(await readline()); const lists []; while (true) { try { const s await readline(); if (s.length 0) break; lists.push(s.split( ).map(Number)); } catch (e) { break; } } // 窗口矩阵k行n列每一列对应一个窗口这里将二维矩阵一维化方便后面赋值 const windows new Array(k * n); // 窗口矩阵中正在赋值的索引位置 let idx 0; // 正在从第level个列表中取值 let level 0; // 当窗口矩阵填满后结束循环 while (idx windows.length) { // 当前轮次是否发生了借动作 let flag false; // 从第level个列表中取前n个元素 for (let i 0; i n; i) { windows[idx] lists[level].shift(); // 如果第level个列表没有元素了则继续切到下一个列表中借 if (lists[level].length 0 lists.length 1) { lists.splice(level, 1); // 删除空列表 level % lists.length; // 防止越界 flag true; // 发生了借动作 } } // 如果没有发生借动作则需要切到下一行 if (!flag) { level (level 1) % lists.length; // 防止越界 } } const ans []; // 遍历列号 for (let j 0; j n; j) { // 遍历行号 for (let i 0; i k; i) { // 按列收集元素 ans.push(windows[i * n j]); } } console.log(ans.join( )); })();Java算法源码import java.util.*; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int n Integer.parseInt(sc.nextLine()); int k Integer.parseInt(sc.nextLine()); ArrayListLinkedListInteger lists new ArrayList(); while (sc.hasNextLine()) { String line sc.nextLine(); // 本地测试以空行作为输入截止条件 if (line.length() 0) break; Integer[] nums Arrays.stream(line.split( )).map(Integer::parseInt).toArray(Integer[]::new); lists.add(new LinkedList(Arrays.asList(nums))); } // 窗口矩阵k行n列每一列对应一个窗口这里将二维矩阵一维化方便后面赋值 int[] windows new int[k * n]; // 窗口矩阵中正在赋值的索引位置 int idx 0; // 正在从第level个列表中取值 int level 0; // 当窗口矩阵填满后结束循环 while (idx windows.length) { // 当前轮次是否发生了借动作 boolean flag false; // 从第level个列表中取前n个元素 for (int i 0; i n; i) { windows[idx] lists.get(level).removeFirst(); // 如果第level个列表没有元素了则继续切到下一个列表中借 if (lists.get(level).size() 0 lists.size() 1) { lists.remove(level); // 删除空列表 level % lists.size(); // 防止越界 flag true; // 发生了借动作 } } // 如果没有发生借动作则需要切到下一行 if (!flag) { level (level 1) % lists.size(); // 防止越界 } } StringJoiner sj new StringJoiner( ); // 遍历窗口矩阵的每一列 for (int j 0; j n; j) { // 遍历列号 for (int i 0; i k; i) { // 遍历行号 sj.add(windows[i * n j] ); // 将每一列的元素进行拼接 } } System.out.println(sj); } }Python算法源码# 输入获取 n int(input()) k int(input()) lists [] while True: try: lists.append(list(map(int, input().split()))) except: break # 算法入口 def getResult(): # 窗口矩阵k行n列每一列对应一个窗口这里将二维矩阵一维化方便后面赋值 windows [0] * (k * n) # 窗口矩阵中正在赋值的索引位置 idx 0 # 正在从第level个列表中取值 level 0 # 当窗口矩阵填满后结束循环 while idx len(windows): # 当前轮次是否发生了借动作 flag False # 从第level个列表中取前n个元素 for _ in range(n): windows[idx] lists[level].pop(0) idx 1 # 如果第level个列表没有元素了则继续切到下一个列表中借 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) # 防止越界 ans [] # 遍历列号 for j in range(n): # 遍历行号 for i in range(k): # 按列收集元素 ans.append(windows[i * n j]) return .join(map(str, ans)) # 算法调用 print(getResult())C算法源码#include stdio.h #include string.h #include stdlib.h #define MAX_ROWS 100 #define MAX_ROW_LEN 10000 /* 链表节点 */ typedef struct Node { int val; struct Node *next; } Node; /* 链表 */ typedef struct Link { int size; Node *head; Node *tail; } Link; // 创建链表 Link *new_Link() { Link *link (Link *) malloc(sizeof(Link)); link-size 0; link-head NULL; link-tail NULL; return link; } // 尾插 void addLast_Link(Link *link, int val) { Node *node (Node *) malloc(sizeof(Node)); node-val val; node-next NULL; if (link-size 0) { link-head node; link-tail node; } else { link-tail-next node; link-tail node; } link-size; } // 头删 int removeFirst_Link(Link *link) { if (link-size 0) exit(-1); Node *removed link-head; if (link-size 1) { link-head NULL; link-tail NULL; } else { link-head link-head-next; } link-size--; int val removed-val; free(removed); return val; } int main() { int n, k; scanf(%d %d, n, k); getchar(); Link *lists[MAX_ROWS]; int lists_size 0; char s[MAX_ROW_LEN]; while (gets(s)) { // 本地测试以空行作为输入截止条件 if (strlen(s) 0) break; Link *link new_Link(); char *token strtok(s, ); while (token ! NULL) { addLast_Link(link, atoi(token)); token strtok(NULL, ); } lists[lists_size] link; } // 窗口矩阵k行n列每一列对应一个窗口这里将二维矩阵一维化方便后面赋值 int windows[k * n]; // 窗口矩阵中正在赋值的索引位置 int idx 0; // 正在从第level个列表中取值 int level 0; // 当窗口矩阵填满后结束循环 while (idx k * n) { // 当前轮次是否发生了借动作 int flag 0; // 从第level个列表中取前n个元素 for (int i 0; i n; i) { windows[idx] removeFirst_Link(lists[level]); // 如果第level个列表没有元素了则继续切到下一个列表中借 if (lists[level]-size 0 lists_size 1) { // 删除第level个空列表 for (int j level 1; j lists_size; j) { lists[j - 1] lists[j]; } lists_size--; level % lists_size; // 防止越界 flag 1; // 发生了借动作 } } // 如果没有发生借动作则需要切到下一行 if (!flag) { level (level 1) % lists_size; // 防止越界 } } // 遍历列号 for (int j 0; j n; j) { // 遍历行号 for (int i 0; i k; i) { // 按列打印 printf(%d, windows[i * n j]); if (j ! n - 1 || i ! k - 1) { printf( ); } } } return 0; }

相关新闻

吴恩达深度学习课程一:神经网络和深度学习 第二周:神经网络基础(二)

吴恩达深度学习课程一:神经网络和深度学习 第二周:神经网络基础(二)

未匾挥矣此分类用于记录吴恩达深度学习课程的学习笔记。 课程相关信息链接如下: 原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai github课程资料,含课件与笔记:吴恩达深度学习教学资料 课程配套练习(中英)与…

2026/7/7 3:01:55 阅读更多 →
大数据领域数据中台的自动化测试方案

大数据领域数据中台的自动化测试方案

大数据中台自动化测试全攻略:从0到1搭建可靠的质量保障体系 引言:数据中台的质量痛点,你中了几个? 作为数据中台的从业者,你是否遇到过这些场景: 业务方反馈报表数据错误,排查发现是DWS层汇总逻…

2026/7/7 6:51:11 阅读更多 →
AIGC 领域下 AIGC 小说的用户体验

AIGC 领域下 AIGC 小说的用户体验

AIGC 领域下 AIGC 小说的用户体验关键词:AIGC、AIGC 小说、用户体验、人工智能创作、阅读感受摘要:本文聚焦于 AIGC 领域下的 AIGC 小说,深入探讨其用户体验。首先介绍了 AIGC 及 AIGC 小说的背景,明确研究目的与范围。接着剖析 A…

2026/7/7 1:45:21 阅读更多 →

最新新闻

QQ音乐解析技术深度解析:逆向工程与API架构设计

QQ音乐解析技术深度解析:逆向工程与API架构设计

QQ音乐解析技术深度解析:逆向工程与API架构设计 【免费下载链接】MCQTSS_QQMusic QQ音乐解析 项目地址: https://gitcode.com/gh_mirrors/mc/MCQTSS_QQMusic 技术挑战与行业痛点 在数字音乐版权保护日益严格的今天,音乐平台API接口的封闭性给开发…

2026/7/7 6:55:51 阅读更多 →
06 Lottery Ticket Hypothesis 详解:稀疏子网络为何能中奖?

06 Lottery Ticket Hypothesis 详解:稀疏子网络为何能中奖?

一、论文基本信息 论文名称:The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks 作者:Jonathan Frankle, Michael Carbin 会议:ICLR 2019 论文链接:https://openreview.net/forum?idrJl-b3RcF7 arXiv 链…

2026/7/7 6:53:51 阅读更多 →
腾讯云TBDS面向AI时代的多模态智算平台,助力企业AI转型

腾讯云TBDS面向AI时代的多模态智算平台,助力企业AI转型

// TBDS 多模智算平台系列 //随着多模态大模型快速演进,企业在AI基础设施层面面临异构算力管理复杂、数据处理链路冗长、训练推理资源割裂浪费等核心挑战。腾讯云TBDS基于Ray构建多模态数据智算平台,支持GPU/CPU等异构资源统一调度,把多模数…

2026/7/7 6:53:51 阅读更多 →
2026年想挑正宗农家土榨花生油?这几个TOP技巧你掌握了吗?

2026年想挑正宗农家土榨花生油?这几个TOP技巧你掌握了吗?

中秋佳节将至,给员工选份贴心福利成了企业采购的头等大事。很多企业会考虑选花生油作为福利,但是现在市场上花生油品牌众多,想挑到正宗农家土榨花生油可不容易。今天我就以马山县周鹿镇蔡家花生油厂为例,跟大家好好聊聊挑选正宗农…

2026/7/7 6:53:51 阅读更多 →
Kali与Metasploit实战:Slowloris慢速攻击原理、复现与防御

Kali与Metasploit实战:Slowloris慢速攻击原理、复现与防御

1. 项目概述:为什么选择Slowloris作为入门实战?如果你刚接触网络安全,或者对渗透测试和攻击原理充满好奇,那么“Slowloris攻击”绝对是一个绝佳的起点。它不像那些需要复杂工具链和深厚背景知识的漏洞利用,Slowloris的…

2026/7/7 6:51:51 阅读更多 →
深度解析Resources Saver:现代网页资源捕获与结构化保存的技术架构

深度解析Resources Saver:现代网页资源捕获与结构化保存的技术架构

深度解析Resources Saver:现代网页资源捕获与结构化保存的技术架构 【免费下载链接】ResourcesSaverExt Chrome Extension for one click downloading all resources files and keeping folder structures. 项目地址: https://gitcode.com/gh_mirrors/re/Resource…

2026/7/7 6:49:50 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻