2023华为od机试C卷【推荐多样性】C语言 实现
目录
题目
推荐多样性需要从多个列表中选择元素,一次性要返回N屏数据(窗口数量),每屏展示K个元素(窗口大小),选择策略
1.各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一元素,再从第二个列表中为每屏选择一个元素,依次类推2.每个列表的元素尽量均分为N份,如果不够N个,也要全部分配完,比如下面的例子:
(1)从第一个列表中选择4条0 12 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,表示每个窗口需要的元素数量Q,取值范用[1,100]之后的行数不定(行数取值范围[1,10],表示每个列表输出的元素列表。元素之间以空格分隔,已经过准序外理,每人列表输出的元素数量取值范围[1,100]
输出描述
输出元素列表,元素数量=窗口数量“窗口大小,元素之间以空格分隔,多个窗口合并为一个列表输出,参考样例:先输出窗口1的元素列表,再输出窗口2的元素列表,再输出窗口3的元素列表,最后输出窗口4的元素列表
示例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
输出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
说明:1.每个列表会保证元素数最满足窗口要求,不需要考虑元素不足情况
2.每个列表的元素已去重,不需要考虑元素重复情况
3.每个列表的元素列表均不为空,不需要考虑列表为空情况
4.每个列表的元素列表已经过排序处理,输出结果要保证不改变同一个列表的元素顺序
5.每个列表的元素数量可能是不同的
思路
1:题目很长,耐心读完的话会发现其实是个简单的题目。
2:我们只要按照题目中给的示例分析来模拟整个过程即可(已加粗)。很多时候,题目的描述很长很臭,但是核心思路往往就在题目给的例子的描述里,大家要注意判断。
Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>
#include <limits.h>
#include <float.h>
#include <regex.h>
#include <ctype.h>
#define CEILING_POS(X) ((X-(int)(X)) > 0 ? (int)(X+1) : (int)(X))
#define CEILING_NEG(X) ((X-(int)(X)) < 0 ? (int)(X-1) : (int)(X))
#define CEILING(X) ( ((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X) )
#define MIN(a, b) ((a) < (b)) ? (a) : (b)
#define MAX(a, b) ((a) > (b)) ? (a) : (b)
int cmpfunc_str (const void * a, const void * b) {
return strcmp(a ,b);
}
int cmpfunc (const void * a, const void * b) {
return ( *(int*)a - *(int*)b );
}
//qsort(dp, m+1, sizeof(int), cmpfunc);
/*
char input[200000];
fgets(input, 200000, stdin);
//逗号分隔
char* token = strtok(input, ",");
int v[1000];
int score1 = 0;
while (token != NULL) {
v[score1++] = atoi(token);
token = strtok(NULL, ",");
}*/
int cmp(const void *a,const void *b)
{
int *ap = (int *)a;
int *bp = (int *)b;
if(bp[0] == ap[0]){
return ap[1]>bp[1];
} else {
return ap[0]>bp[0];
}
}
//qsort(a, n, sizeof(a[0]), cmp);
int main() {
char input1[200];
fgets(input1, 200, stdin);
char input2[200];
fgets(input2, 200, stdin);
int n= atoi(input1);
int m= atoi(input2);
int input_matrix[10][100];
int input_length[10];
int count = 0;
char input[2000];
while (fgets(input, 200, stdin)) {
if(strlen(input) == 0){
break;
} else {
char* token = strtok(input, " ");
int nums[1000];
int length = 0;
while (token != NULL) {
nums[length++] = atoi(token);
token = strtok(NULL, " ");
}
input_length[count] = length;
for(int i=0;i<length;i++){
input_matrix[count][i] = nums[i];
}
count+=1;
}
}
int output_length[count];
for (int i = 0; i < count; i++) {
output_length[i] = 0;
}
int nums[100000];
int total=0;
while (true) {
if(total >= n * m){
break;
} else {
for (int i = 0; i < count; i++) {
int index = input_length[i];
if(input_length[i] > output_length[i] + 4){
index = output_length[i] + 4;
}
for (int j = output_length[i]; j < index; j++) {
nums[total++] = input_matrix[i][j];
}
output_length[i] = index;
}
}
}
for (int j = 0; j < n; j++) {
for (int i = 0; i < m; i++) {
printf("%d ", nums[i * n + j]);
}
}
return 0;
}
【华为od机试真题Python+JS+Java合集】【超值优惠】:Py/JS/Java合集
【华为od机试真题Python】:Python真题题库
【华为od机试真题JavaScript】:JavaScript真题题库
【华为od机试真题Java】:Java真题题库
【华为od机试真题C++】:C++真题题库
【华为od机试真题C语言】:C语言真题题库
【华为od面试手撕代码题库】:面试手撕代码题库
【华为od机试面试交流群:830285880】