题解 | #明明的随机数#

明明的随机数

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

1、先尝试一下最基础的做法,即使用数组排序和数组去重的相关知识;

#include <stdio.h>
#include <malloc.h>

/*解法一:基础版,使用排序和去重知识。*/

int remove_repeat(int *list, int size)
{
    int i,j,k;
    for(i = 0 ; i < size - 1 ; i++)
    {
        for(j = i + 1 ; j < size ; j++)
        {
            if(list[i] == list[j])//找到重复的数字之后,将后面的数字依次向前挪。
            {
                for(k = j ; k < size - 1; k++)
                {
                    list[k] = list[k+1];
                }
                j--;//当后面的数字依次向前挪之后,j指向的值也应该向前挪1个位置,否则会无法进行原本j+1位置的对比,比如有序列1,0,1,1,那么最后一个1就会被忽略。
                size--;//总大小减1
                list[k] = 0;//后面补0
            }
        }
    }
    return size;
}

void quick_sort(int *list, int left, int right)
{
    if(left >= right)
        return;
    int i = left, j = right, key = list[left];//取数组坐左边的元素值为key,数组将按照key值划分为两部分,左边比key小,右边比key大;
    while(i < j)
    {
        while(list[j] >= key && i < j)//先从右往左,移动j找到比key小的值,将j的数值赋值至i;
            j--;
        list[i] = list[j];

        while(list[i] <= key && i < j)//从左往右,移动i找到比key大的值,将i的数值赋值至j;
            i++;
        list[j] = list[i];

    }
    list[i] = key;//key的位置为i,已经确定了,所以需要将0 ~ i-1和 i+1 ~ n继续排序
    quick_sort(list, left, i - 1);//将 0 ~ i-1 继续排序
    quick_sort(list, i + 1, right);//将 i+1 ~ n 继续排序
}
int main(void)
{
    int sum = 0;
    int num = 0;
    while(scanf("%d",&sum) != EOF)
    {
        int *numList = (int *)malloc(sizeof(int) * sum);
        int i = sum;
        while(i--)
        {
            scanf("%d",&num);
            numList[i] = num;
        }
        int size = remove_repeat(numList, sum);
        quick_sort(numList, 0, size - 1);
        for(int i = 0 ; i < size ; i ++)
            printf("%d\r\n",numList[i]);
    }
}

2、巧妙的做法是利用哈希表的思想,将收到的数字填入该数字大小的索引位置,然后按顺序输出; 本思想可以利用题目条件数据范围:1≤n≤1000,输入的数字大小满足:1≤val≤500 ,那么哈希表数组的其余数字可设置为0,便于后续输出;

/*解法二:使用哈希表思想*/

int main(void)
{
    int size = 0, num = 0;
    while(scanf("%d", &size) != EOF)
    {
        int numList[501] = {0};
        while(size--)
        {
            scanf("%d",&num);
            numList[num] = num;
        }
        for(int i = 0 ; i < 501 ; i ++)
        {
            if(numList[i] != 0)
            {
                printf("%d\r\n", numList[i]);
            }
        }
    }
}








全部评论
想问下去重list[k] = 0;//后面补0,为什么要补0呢,补了不是有重复值0了吗,补0的作用是什么呢?
点赞 回复 分享
发布于 2023-02-23 19:31 重庆

相关推荐

头像
03-03 15:53
已编辑
黑龙江大学 Java
在当前开源项目极为丰富的背景下,付费资源并不一定意味着最前沿的技术优势,在具体执行层面展示出自己的独特价值,才是简历上最重要的加分项。1.&nbsp;WebMCP&nbsp;—&nbsp;让网站主动告诉&nbsp;AI&nbsp;该怎么操作AI&nbsp;操作浏览器的方案一直靠&quot;猜&quot;——截图识别、DOM&nbsp;解析,错误率&nbsp;15-30%。WebMCP&nbsp;反过来,让网站自己声明能做什么,AI&nbsp;直接调用结构化接口,准确率接近&nbsp;100%。Chrome&nbsp;Canary&nbsp;已实装。企业内部系统的&nbsp;WebMCP&nbsp;适配目前几乎没人做,是明确的蓝海。推荐理由:简历上写的不是&quot;我会用某个框架&quot;,而是&quot;我在标准刚发布时就做了企业适配&...
书海为家:#人脑vsAI# 尽管深度学习的最初灵感来源于人类的大脑,但二者的运作方式截然不同:深度学习所需要的数据量远比人脑所需要的多得多。可是一旦经过大数据训练,它在相同领域的表现将远远超过人类(尤其是在数字的量化学习,例如挑选某人最可能购买的产品,或从100万张脸中挑选最匹配的一张)——相对来说,人类在同一时间内只能把注意力放在少数几件事情上面,而深度学习算法却可以同时处理海量信息,并且发现在大量数据背后的模糊特征之间的关联,这些模糊特征不仅复杂而且微妙,人类往往无法理解,甚至可能不会注意到。 虽然深度学习拥有人类所缺乏的并行处理海量数据的“绝技”,但不具备人类在面对决策时独一无二的汲取过去的经验、使用抽象概念和常识的能力。 与人类相比,深度学习想要充分发挥作用,离不开海量的相关数据、单一领域的应用场景以及明确的目标函数,这三项缺一不可,如果缺少其中任何一项,深度学习将无用武之地。
AI求职实录
点赞 评论 收藏
分享
评论
74
19
分享

创作者周榜

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