题解 | #合并表记录#

合并表记录

https://www.nowcoder.com/practice/de044e89123f4a7482bd2b214a685201

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

static int *key_l,*vlu_l,*nxt_l;

static int InsertIntoChain(unsigned int Priv,unsigned int New){
    if(key_l[nxt_l[Priv]] > key_l[New]){
        nxt_l[New] = nxt_l[Priv];
        nxt_l[Priv] = New;
        return 0;
    }
    if(key_l[nxt_l[Priv]] == key_l[New]){
        vlu_l[nxt_l[Priv]] += vlu_l[New];
        return 0;
    }
    return 1;
}

int main(void){
    int InputLines=0,temp_index=0,curr_key=0;

    scanf("%u",&InputLines);
    key_l = malloc((InputLines+1)*sizeof(unsigned int)*3);
    vlu_l = key_l + InputLines + 1;
    nxt_l = vlu_l + InputLines + 1;
    *key_l = -1;
    *nxt_l = 1;

    for(int i=1;i<=InputLines;i++){
        scanf("\n%u %u",key_l+i,vlu_l+i);
        *(nxt_l+i) = 0;
    }
    for(int i=2;i<=InputLines;i++){
        while(InsertIntoChain(temp_index,i)){
            if(nxt_l[nxt_l[temp_index]] == 0){
                nxt_l[nxt_l[temp_index]] = i;
                break;
            }
            temp_index = nxt_l[temp_index];
        }
        temp_index = 0;
    }
    temp_index = nxt_l[0];
    for(int i=1;i<=InputLines;i++){
        printf("%d %d\n",key_l[temp_index],vlu_l[temp_index]);
        temp_index = nxt_l[temp_index];
        if(temp_index == 0) break;
    }
}

用三个数组模拟一个链表,通过链表进行排序和输出。

全部评论
这里要求的key和value的范围都很大,如果用数组的索引作为key的话,占用空间会很大,比如评论中的答案,大部分都把数组长度设置的比较小,遇到key大一些的用例就会不通过。本程序所申请的空间与输入条数挂钩,而与用例中key大小无关,这是本程序的优势。
点赞 回复 分享
发布于 2024-02-21 09:56 浙江

相关推荐

在投简历的柠檬精很想...:可以明确说,问的东西几乎是简历上的东西。你写的确实有点模糊。面试可能会问你一些常用的通信的问题,差分信号走线之类的,单片机最小系统啥的,模电,数电,基本电源,buck,boost,ldo之类的吧。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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