【华为OD机试真题 C语言】6、数组去重和排序 | 机试真题+思路参考+代码解析

文章目录

    • 一、题目
      • 题目描述
      • 输入输出
      • 样例1
    • 二、思路参考
    • 三、代码参考
      • C语言
  • 作者:KJ.JK


个人博客首页: KJ.JK
 
专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习


一、题目


题目描述

给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序


输入输出

输入
一个数组
 
输出
去重排序后的数组


样例1

输入
1,3,3,3,2,4,4,4,5


输出
3,4,1,2,5


说明:
数组大小不超过100 数组元素值大小不超过100

二、思路参考

  1. 定义一个结构体用于表示元素,包括值、出现次数和第一次出现的索引。
  2. 创建一个结构体数组或者使用哈希表,用于存储元素及其相关信息。
  3. 读取输入的字符串,并使用逗号分隔各个元素。
  4. 遍历分隔后的元素数组,对于每个元素:
    检查结构体数组或哈希表中是否已存在该元素。
    如果不存在,则创建一个新的结构体,并将元素的值、出现次数设为1,第一次出现的索引设为当前索引,并将该结构体添加到结构体数组或哈希表中。
    如果存在该元素,则增加其出现次数。

5.对结构体数组进行排序,按照出现次数从高到低排序,如果出现次数相同,则按照第一次出现的顺序排序

6.遍历排序后的结构体数组,输出元素的值,使用逗号进行分隔。


三、代码参考


C语言

#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;
}


作者:KJ.JK

你可能感兴趣的:(华为OD机试真题(C语言),c语言,数据结构,算法,数组去重和排序,华为OD机试真题)