【编程题目 | 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;
}