赞
踩
OD统一考试(C卷)
分值: 200分
题解: Java / 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和窗口2
(6)再从第二个列表中选择,由于数量不足4条并且总的元素数达到窗口要求,取18 19放到窗口3和窗口4
第一行输入为N,表示需要输出的窗口数量,取值范围 [1, 10]
第二行输入为K,表示每个窗口需要的元素数量,取值范围 [1, 100]
之后的行数不定(行数取值范围[1,10]),表示每个列表输出的元素列表。元素之间以空格分隔,已经过排序处理,每个列表输出的元素数量取值范围[1,100]
输出元素列表,元素数量=窗口数量*窗口大小,元素之间以空格分隔,多个窗口合并为一个列表输出,参考样例:
先输出窗口1的元素列表,再输出窗口2的元素列表,再输出窗口3的元素列表,最后输出窗口4的元素列表
补充说明
每个列表会保证元素数量满足窗口要求,不需要考虑元素不足情况
每个列表的元素已去重,不需要考虑元素重复情况
每个列表的元素列表均不为空,不需要考虑列表为空情况
每个列表的元素列表已经过排序处理,输出结果要保证不改变同一个列表的元素顺序
每个列表的元素数量可能是不同的
输入:
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
输出:
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
这道题目是一个简单的数据处理问题,需要根据输入的窗口数量、窗口大小以及多个列表中的元素,按照规定的选择策略进行元素的选取和输出。下面是解题思路和代码描述:
解题思路:
- 首先读取输入的窗口数量和窗口大小,然后读取多个列表的元素。
- 根据窗口数量和窗口大小,依次从每个列表中选择元素并放入对应的窗口中,按照规定的选择策略进行穿插处理。
- 最后输出选取的元素列表,合并多个窗口的元素为一个列表输出。
import java.util.*; /** * @author code5bug */ public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(), k = in.nextInt(); in.nextLine(); // 消耗掉换行符号 // 读入列表元素 List<Queue<Integer>> lq = new ArrayList<>(); while (in.hasNext()) { int[] nums = Arrays.stream(in.nextLine().split(" ")) .mapToInt(Integer::parseInt).toArray(); Queue<Integer> queue = new ArrayDeque<>(); for (int num : nums) queue.add(num); lq.add(queue); } // n 个窗口数据 Queue<Integer>[] windows = new Queue[n]; Arrays.setAll(windows, i -> new ArrayDeque<>()); // 列表元素穿插放入 n 个窗口中 int qidx = 0; // 当前处理到的列表索引位置 while (k-- > 0) { for (int i = 0; i < n; i++) { Queue<Integer> queue = lq.get(qidx); // 直到找到有数据的列表 while (queue.isEmpty()) queue = lq.get((++qidx) % lq.size()); windows[i].add(queue.poll()); } qidx = (qidx + 1) % lq.size(); } // 拼接结果 StringBuilder rs = new StringBuilder(); for (int i = 0; i < windows.length; i++) { while (!windows[i].isEmpty()) { rs.append(windows[i].poll()).append(" "); } } System.out.println(rs.toString()); } }
from collections import deque n, k = int(input()), int(input()) input_lists = [] # 读入列表元素 while True: try: input_lists.append(deque(input().split())) except EOFError: break idx = 0 # 当前处理到的列表索引位置 windows = [list() for _ in range(n)] # n 个窗口数据 # 列表元素穿插放入 n 个窗口中 for _ in range(k): for i in range(n): while not input_lists[idx]: idx = (idx + 1) % len(input_lists) windows[i].append(input_lists[idx].popleft()) idx = (idx + 1) % len(input_lists) # 拼接结果 ls = [' '.join(window) for window in windows] print(' '.join(ls))
#include <bits/stdc++.h> using namespace std; int main() { int n, k; cin >> n >> k; cin.ignore(); // 消耗掉换行符号 // 读入列表元素 vector<queue<int>> lq; string line; while (getline(cin, line)) { istringstream iss(line); queue<int> queue; int num; while (iss >> num) { queue.push(num); } lq.push_back(queue); } // n 个窗口数据 vector<queue<int>> windows(n); // 列表元素穿插放入 n 个窗口中 int qidx = 0; // 当前处理到的列表索引位置 while (k-- > 0) { for (int i = 0; i < n; i++) { // 直到找到有数据的列表 while (lq[qidx].empty()) { qidx = (qidx + 1) % lq.size(); } windows[i].push(lq[qidx].front()); lq[qidx].pop(); } qidx = (qidx + 1) % lq.size(); } // 拼接结果 stringstream rs; for (int i = 0; i < windows.size(); i++) { while (!windows[i].empty()) { rs << windows[i].front() << " "; windows[i].pop(); } } cout << rs.str() << endl; return 0; }
有考友通过专栏已经快速通过机考✍,都是原题哦,
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/322701
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。