题解 | #明明的随机数#

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

#include <stdio.h>
#include <stdlib.h>

//快排 的算法
void quick_sort(int arry[],int low,int high)
{
    if(low>=high)
        return;
    int key=arry[low];
    int i=low;
    int j=high;
    while(i<j)
    {
        while(i<j && arry[j]>=key)
            j--;
        if(i<j)
        {
            arry[i]=arry[j];
            i++;
        }
        while(i<j && arry[i]<=key)
            i++;
        if(i<j)
        {
            arry[j]=arry[i];
            j--;
        }
    }
    arry[i]=key;
    
    quick_sort(arry, low, i-1);
    quick_sort(arry, i+1, high);
}

//无序去重的方法
//一点点区别是思路是发现重复的把这个重复的和最后面的去对调
//比数组顺序移动要快不少
int repeat_remove(int arry[],int len)
{
    int low = 1, high = len - 1;
    while (low <=high)//注意考虑等号的情况
    {
        for (int i = 0; i < low; i++)
        {
            if (arry[i] == arry[low])
            {
                int var = arry[high];
                arry[high] = arry[low];
                arry[low] = var;
                high--;//尾值向前移一位
                low--;//保证low不变
                break;
            }
        }
        low++;
    }
    return high+1; //不能是low+1 因为low最后会比high大
}

//有序数组的去重方法
//原理就是找数组相邻的数据
//然后数组集体前移N位
int order_repeat_remove(int arry[],int len)
{
    int max = arry[len - 1];
    for (int i = 0;i < len;i++)
    {
        int j = i + 1;
        while (arry[i]==arry[j])
        {
            j++;
        }
        if (j > i + 1)
        {
            int removenum = j - i - 1;
            for (int kk = j; kk < len; kk++)
            {
                arry[kk - removenum] = arry[kk];
                arry[kk] = max + 1;//目的在于保证这个数据和其他所有数据都不一样
            }
            len = len - removenum;
        }
    }
    return len;
}

void dispaly(int arry[],int len)
{
    for(int i=0;i<len;i++)
    {
        printf("%d\n",arry[i]);
    }
}

int main()
{
    int count,number;
    scanf("%d",&count);
    int * array=(int *)(malloc(count*sizeof(int)));
    int i=0;
    while(scanf("%d",&number)!=EOF)//构建输入数组
    {
        array[i]=number;
        i++;
    }
    int len=repeat_remove(array,count);//先去重在排序
    quick_sort(array,0,len-1);   
   // quick_sort(array,0,count-1); //先排序在去重
   // int len=order_repeat_remove(array,count);
        dispaly(array,len);
}            


全部评论

相关推荐

点赞 评论 收藏
分享
机械打工仔:有说的你怀疑一下就行了,直接问也太实诚了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 16:15
我应届生,去年10月份开始在这家公司实习,到今年10月份正好一年想(实习+试用期),在想要不要提前9月份就离职,这样好找工作些,但又差一个月满一年,又怕10月份国庆回来离职,容易错过了下半年的金九银十,到年底容易gap到年后
小破站_程序员YT:说这家公司不好吧,你干了快一年 说这家公司好吧,你刚毕业就想跑路说你不懂行情吧,你怕错过金九银十说 你懂行情吧,校招阶段在实习,毕业社招想换工作 哥们,我该怎么劝你留下来呢
应届生,你找到工作了吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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