个人博客首页: KJ.JK
专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习
给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序
输入
一个数组
输出
去重排序后的数组
输入
1,3,3,3,2,4,4,4,5
输出
3,4,1,2,5
说明:
数组大小不超过100 数组元素值大小不超过100。
5.对结构体数组进行排序,按照出现次数从高到低排序,如果出现次数相同,则按照第一次出现的顺序排序
6.遍历排序后的结构体数组,输出元素的值,使用逗号进行分隔。
#include
#include
#include
// 定义元素结构体
typedef struct {
int value;
int count;
int firstIndex;
} Element;
// 比较函数,用于qsort排序
int compare(const void* a, const void* b) {
const Element* elementA = (const Element*)a;
const Element* elementB = (const Element*)b;
if (elementA->count != elementB->count) {
return elementB->count - elementA->count;
}
return elementA->firstIndex - elementB->firstIndex;
}
int main() {
int inputSize = 50000;
Element* elements = malloc(inputSize * sizeof(Element));
int elementCount = 0;
// 读取输入的数组
char input[100000];
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = '\0';
// 将输入字符串按逗号分隔为整数数组并统计元素出现次数和第一次出现的索引
char* token = strtok(input, ",");
int index = 0;
while (token != NULL) {
int num = atoi(token);
// 检查元素是否已存在
int existingIndex = -1;
for (int i = 0; i < elementCount; i++) {
if (elements[i].value == num) {
existingIndex = i;
break;
}
}
// 如果元素不存在,则添加到元素数组中
if (existingIndex == -1) {
Element newElement;
newElement.value = num;
newElement.count = 1;
newElement.firstIndex = index;
elements[elementCount++] = newElement;
} else {
// 如果元素已存在,则增加计数
elements[existingIndex].count++;
}
token = strtok(NULL, ",");
index++;
}
// 对元素数组进行排序
qsort(elements, elementCount, sizeof(Element), compare);
// 输出去重排序后的数组
for (int i = 0; i < elementCount; i++) {
printf("%d", elements[i].value);
if (i < elementCount - 1) {
printf(",");
}
}
printf("\n");
// 释放动态分配的内存
free(elements);
return 0;
}