当前位置: 首页 > article >正文

(c语言版)数组去重和排序 题目描述: 给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低

【编程题目 | 100分】数组去重和排序 [ 100 / 中等 ]

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

输入描述:
一个数组

输出描述:
去重排序后的数组

示例 1:
输入
1,3,3,3,2,4,4,4,5
输出
3,4,1,2,5

#include <stdio.h>
/* 1,先统计每个数字出现的次数*/
/* 2,根据每个数字出现的次数来排序*/
/* 3,输出 */

struct t_data{
    int num; //某个数,
    int times; //这个数字出现了几次。
};
int statis(int a[],int nums,struct t_data mydata[]) {
    int data_types = 0; // 分类后
    int i = 0;
    int j = 0;
    for(i = 0;i<nums;i++){
        for(j = 0;j< data_types;j++){
            if(a[i] == mydata[j].num){ //在结构体数组中找到了这个数,个数加1
                mydata[j].times++;
                break;
            }
        }
        if(j == data_types){ //没找到,增加一项 。
            mydata[data_types].num = a[i];
            mydata[data_types].times = 1;
            data_types ++;
        }
    }
    return data_types;
}
void myorder(struct t_data mydata[],int data_types){
    for(int i = 1;i<data_types;i++){
        for(int j = 0;j<data_types-i;j++){
            if(mydata[j].times < mydata[j+1].times){
                struct t_data t  = {0};
                t = mydata[j];
                mydata[j] = mydata[j+1];
                mydata[j+1] = t;
            }
        }
    }
}
void output(struct t_data mydata[],int data_types) {
    for(int i = 0 ;i<data_types;i++){
        printf("%d ",mydata[i].num);
    }
}
int main(){
    int a[] = {1,9,3,4,5,5,6,6,6,6,7,8};
    int nums = sizeof(a)/sizeof(a[0]);
    struct t_data mydata[100] = {0};
    /*返回的就是类型数,每个类型又多少数字就放到mydata机构体数组中*/
    int data_types = statis(a,nums,mydata);
    myorder(mydata,data_types);
    output(mydata,data_types);
    return 0;
}

万能去重暴力解法:

int delete_repeat(int a[],int n){
    int after_nums = 0;
    int i = 0;
    int j = 0;
    for(i = 0;i<n;i++){
        for(j = 0;j<after_nums;j++){
            if(a[j] == a[i]){
                break;
            }
        }
        if( j == after_nums){
            a[after_nums] = a[i];
            after_nums++;
        }
    }
    return after_nums;
}
int main(){
    int a[] = {1,3,3,3,3,2,5,3,2,5};
    int n = sizeof(a)/sizeof(a[0]);
    n = delete_repeat(a,n);
    for(int i = 0;i<n;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

http://www.kler.cn/a/234217.html

相关文章:

  • 「Mac玩转仓颉内测版12」PTA刷题篇3 - L1-003 个位数统计
  • Vue.js 项目创建流程
  • 【VIM】vim 常用命令
  • 准确率调整研究中心
  • 代码随想录第二十一天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
  • 大厂的 404 页面都长啥样?看看你都见过吗~~~
  • 设计模式-行为型模式(下)
  • 七、热身仪式(Warm-Up Rituals)
  • 《杨绛传:生活不易,保持优雅》读书摘录
  • Github 2024-02-10 开源项目日报Top10
  • Flink面试准备
  • 代码随想录算法训练营第三十三天丨[重看] 最大子数组、1143. 最长公共子序列/15.4 最长公共子序列
  • Android 识别车牌信息
  • Rust 格式化输出
  • TestNG基础教程
  • fast.ai 机器学习笔记(二)
  • JVM-类加载器 双亲委派机制
  • 项目02《游戏-13-开发》Unity3D
  • 在 Windows上恢复删除照片的 4 种有效方法
  • 初步探索Pyglet库:打造轻量级多媒体与游戏开发利器
  • 多维时序 | Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预测
  • hexo 博客搭建以及踩雷总结
  • 面向对象编程:理解其核心概念与应用
  • linux上部署ftp服务
  • MongoDB聚合:$replaceWith
  • visual studio和cmake如何编译dlib库