题解 | #明明的随机数#

明明的随机数

https://www.nowcoder.com/practice/3245215fffb84b7b81285493eae92ff0

#include <stdio.h> //标准输入输出库用于调用我们的scanf和printf
#include <stdlib.h> //包含了我们的qsort函数用于快速排序

int compare(const void* a, const void* b) { //定义了一个比较函数,在qsort函数进行排序时中比较两个元素的大小,它接受两个void*类型的指针函数
    return *(int*)a - *(int*)b; //将其转换为int*类型后,返回两个整数的差值,从而实现从小到大的排序
}

int main() { //主程序开始
    int n; //定义一个整数n,用来存储我们的N
    scanf("%d", &n); //将第一行的N读取进n
    int countArray[501] = {0}; // 定义一个整数数组,将其值初始化为0,用于记录数字出现次数
    int resultArray[n]; // 用于存储去重后的数字
    int resultCount = 0; // 用于储存不重复的数字的个数(qsort时需要使用)
    for (int i = 0; i < n; i++) { //遍历数据
        int num; //用于存储数据
        scanf("%d", &num); //将数据储存到num中
        if (countArray[num] == 0) { //如果这个数字还没有出现过
            resultArray[resultCount++] = num; //把这个数字存储到resultArray的第resultCount位置
            countArray[num]++; //将此数次出现次数加一
        }
    }
    qsort(resultArray, resultCount, sizeof(int), compare); //对结果进行排序
    for (int i = 0; i < resultCount; i++) { //遍历结果
        printf("%d\n", resultArray[i]); //输出每一行
    }
    return 0;
}

一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.给你一个数字n代表数据的个数(n的范围是1<=n<=1000)

2.给你n个数据,每个数据都是一个1到500之间(包括1和500)的整数

3.去除重复的数据(数值相同的只保留一个)

4.对数据进行排序(从小到大)

5.并输出

二、解题思路

1.首先我们读取第一行,也就是数据的行数n

2.然后我们为了节省时间,一边读取一边判断是否重复

3.为了判断是否重复出现我们需要一个判断重复的方法,这里想到比较简单的

方法就是定义一个数组,大小是500,将数组的默认值都设为0,然后开始遍历数据,遍历数据的时候,如果之前是0的话出现了一次的数字就加1,并且放在另外一个数组中(专门用来储存去重之后的数据)如果已经是1了就跳过。

4.对我们储存去重之后的数据的数组进行排序,这里使用快速排序qsort

5.输出结果

这里需要注意的是qsort

使用方法是qsort(需要排序的数组,数组中元素的数量,元素的大小,比较函数)

全部评论

相关推荐

机械打工仔:第一位颇有孟德之志
点赞 评论 收藏
分享
在开会的单身狗很有一套:学院本被想着这么快有面试,而且简历废话太多了 那些在校经历什么荣誉什么的企业不关心
点赞 评论 收藏
分享
深夜书店vv:腾讯是这样的,去年很多走廊都加桌子当工区
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-27 14:11
很喜欢小米的新车,校招薪资每月22k,攒多久能买?
测试糕手手:别看工资,先看现金流存款。有50W存款以上再考虑,车是消耗品,选适合自己的重要。你有钱就当我没说过
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务