行到云脚忽识路
**
大一漫无目的地过了一年,原本只想在原来的专业插科打诨,轻轻松松。什么“目标”啊,“规划”啊,统统丢到毕业后再考虑。但睡过了一个又一个的下午,嗨了一个又一个的夜晚,心里空落落的,“不得开心颜”。然后一个午后醒来,突然很想哭,不知道自己在干什么——这和当初说好的“惬意生活”不一样,没法过得心安理得。
其实早就知道了自己想干什么,但是很害怕去改变,去碰撞——新织好的窝那么comfortable。左思右想,不知道怎样的选择是对的,觉得那个让自己不好过的选择才是对自己好的(大概吧)。然后咬咬牙,闯进了计算机的世界。
现在,仍然不知道当初选择的对错,但日子确实不好过了(笑。
懵懵懂懂学了几个月,感受到了确实有写写博客的必要,记录自己的学习进程。
新的开始
在这里就先记录下自己写的一个题吧
众数问题
/*
//问题描述:
给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。
例如,S={1,2,2,2,3,5}。多重集S的众数是2,其重数为3。
编程任务:
对于给定的由n 个自然数组成的多重集S,编程计算S 的众数及其重数。
//输入
第1行多重集S中元素个数n(n<=50000);接下来的n 行中,每行有一个自然数。
//输出
输出文件有2 行,第1 行给出众数,第2 行是重数。(如果有多个众数,只输出最小的)
*/
#include<stdio.h>
#include<malloc.h>
int main(){
int n;
scanf("%d", &n);
int *num, *hashTable;
num = (int *)malloc(sizeof(int) * n);
hashTable = (int *)malloc(sizeof(int) * n);
//读入多重集的元素,并把对应的hashTable全部元素置0
for(int i = 0; i < n; i++){
scanf("%d", &num[i]);
hashTable[i] = 0;
}
//冒泡排序,由小到大
int temp;
for(int i = 0; i < n; i++){
for(int j = n - 1; j > i; j--){
if(num[j] < num[j - 1]){
temp = num[j - 1];
num[j - 1] = num[j];
num[j] = temp;
}
}
}
//记录每个元素的重复度
for(int i = 0; i < n - 1; i++){
for(int j = i; j < n; j++){
if(num[i] == num[j]){
hashTable[i]++;
}
}
}
//遍历寻找重复度最大的元素所在下标
int pos = 0, maxn = hashTable[0];
for(int i = 1; i < n; i++){
if(hashTable[i] > maxn){
/*
** 注意这个大于号,即使有多个众数,最开始的那个仍不会被后来的替换,
** 而最开始的那个即使最小的那个众数,这便是进行冒泡排序的意义所在
*/
maxn = hashTable[i];
pos = i;
}
}
printf("%d\n%d\n", num[pos], hashTable[pos]);
return 0;
}