题解 | #数据流中的中位数#

数据流中的中位数

https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1

因为这道题是需要对数据流进行排序,所有用单向链表做题比较方便插入值。只需要记录下链表内已有的个数就可以很方便的得出中位数的值。代码比较简单易懂,欢迎修改。

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param num int整型 
 * @return 无
 */
 typedef struct ChainNode{
    int val;
    struct ChainNode* Next;
 }ChainNode;

static ChainNode* Head;
static int Nnum=0;
void Insert(int num ) {
    ChainNode* NewNode=(ChainNode *)calloc(1,sizeof(ChainNode));
    NewNode->val=num;
    if(Nnum==0)
        Head=NewNode;
    else{
        if(num<Head->val){
            NewNode->Next=Head;
            Head=NewNode;
        }
        else{
            ChainNode* PreNode=Head;
            ChainNode* CurrNode=Head->Next;
            while(CurrNode!=NULL){
                if(num<=CurrNode->val)
                    break;
                PreNode=PreNode->Next;
                CurrNode=CurrNode->Next;
            }
            PreNode->Next=NewNode;
            NewNode->Next=CurrNode;
        }
    }  
    Nnum++;  
}
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param 无 
 * @return double浮点型
 */
double GetMedian() {
    printf("%d\n",Nnum);
    struct ChainNode* Temp=Head;
    int Index=Nnum/2;
    if(Nnum%2==1){
        for(int i=0;i<Index;i++)
            Temp=Temp->Next;
        return (double)Temp->val;
    }
    else {
        for(int i=0;i<Index-1;i++)
            Temp=Temp->Next;
        return (double)Temp->val/2+(double)Temp->Next->val/2;
    }
    
}

#C##链表#
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-24 20:55
阿里国际 Java工程师 2.7k*16.0
程序员猪皮:没有超过3k的,不太好选。春招再看看
点赞 评论 收藏
分享
在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务