【编程题目 | 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){ //在结构体数组中找到了这个数,个数加1mydata[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;
}