题解 | #明明的随机数#
明明的随机数
https://www.nowcoder.com/practice/3245215fffb84b7b81285493eae92ff0
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define HASH_SIZE 500
typedef struct{
int key;
bool is_used;//标记是否被使用
} HashEntry;
typedef struct{
HashEntry* entries;//哈希表条目数组
} HashTable;
//初始化哈希表
void init_hash_table(HashTable *hash_table){
hash_table->entries = (HashEntry*)malloc(HASH_SIZE* sizeof(HashEntry));
for (int i=0; i<HASH_SIZE; i++) {
hash_table->entries[i].is_used=false;
}
}
int hash_function(int key){
return key-1;//数组索引从0开始,所以要减1
}
//插入到哈希表
void insert_to_hash_table(HashTable* hash_table,int key){
int index=hash_function(key);
if (!hash_table->entries[index].is_used) {
hash_table->entries[index].key=key;
hash_table->entries[index].is_used=true;
}
}
//释放哈希表内存
void free_hash_table(HashTable* hash_table){
free(hash_table->entries);
}
//比较函数
int compare(const void* a,const void* b){
return (*(int*)a-*(int*)b);
}
//主函数
int main() {
int n;
scanf("%d\n",&n);
//初始化哈希表,并生成随机数字
//申明一个HashTable类型的变量hash_table,并调用init_hash_table函数初始化它
HashTable hash_table;
init_hash_table(&hash_table);
//用循环生成1-500之间的数字,调用insert_to_hash_table将该随机数插入到哈希表中。
for (int i=0; i<n; i++) {
//若为生成随机数字则
//int random_number = rand() % 500 + 1; // 生成1到500之间的随机整数
int random_number=0;
scanf("%d\n",&random_number);
insert_to_hash_table(&hash_table, random_number);
}
//提取唯一数字,并排序
int unique_number[HASH_SIZE];
int count =0;
for (int i=0; i<HASH_SIZE; i++) {
if (hash_table.entries[i].is_used) {
unique_number[count++]=hash_table.entries[i].key;
}
}
//用qsort函数来排序
qsort(unique_number, count, sizeof(int), compare);
//输出排序后的数组unique_number
for (int i=0; i<count; i++) {
printf("%d\n",unique_number[i]);
}
//释放哈希表内存并结束程序
free_hash_table(&hash_table);
return 0;
}
查看15道真题和解析