美文网首页
笔试刷题-网易2018-08-07

笔试刷题-网易2018-08-07

作者: Dodo159753 | 来源:发表于2018-08-07 06:44 被阅读0次

    题目描述:

    /*
    小云正在参与开发一个即时聊天工具,他负责其中的会话列表部分。
    会话列表为显示为一个从上到下的多行控件,其中每一行表示一个会话,
    每一个会话都可以以一个唯一正整数id表示。
    当用户在一个会话中发送或接收信息时,
    如果该会话已经在会话列表中,则会从原来的位置移到列表的最上方;
    如果没有在会话列表中,则在会话列表最上方插入该会话。
    小云在现在要做的工作是测试,他会先把会话列表清空等待接收信息。
    当接收完大量来自不同会话的信息后,
    就输出当前的会话列表,以检查其中是否有bug。
    输入描述:
    输入的第一行为一个正整数T(T<=10),表示测试数据组数。
    接下来有T组数据。
    每组数据的第一行为一个正整数N(1<=N<=200),表示接收到信息的次数。
    第二行为N个正整数,按时间从先到后的顺序表示接收到信息的会话id。
    会话id不大于1000000000。
    输出描述:
    对于每一组数据,输出一行,按会话列表从上到下的顺序,输出会话id。
    相邻的会话id以一个空格分隔,行末没有空格。
    输入例子1:
    3
    5
    1 2 3 4 5
    6
    1 100 1000 1000 100 1
    7
    1 6 3 3 1 8 1
    输出例子1:
    5 4 3 2 1
    1 100 1000
    1 8 3 6
    */
    
    

    思路如下:

    类似于lru但是limit是无限制而已
    list(自己实现一个双向链表 或者用vector)+hash_map(用stl)

    代码如下:

    #include<stdio.h>
    #include<iostream>
    #include<vector>
    #include<map>
     
    using namespace std;
     
    struct Node
    {
        int val=-1;
        Node *prev=NULL, *next=NULL;
        Node() {}
        Node(int val)
        {
            this->val=val;
        }
        Node(const Node &node)
        {
            this->val=node.val;
            this->next=node.next;
            this->prev=node.prev;
        }
    };
     
    struct NodeList{
        Node *head;
        NodeList(){
            this->head=new Node();
        }
        Node* addNode(int id){
            Node *newNode=new Node(id);
            newNode->next=this->head->next;
            this->head->next=newNode;
            if(newNode->next){
                newNode->next->prev=newNode;
            }
            newNode->prev=this->head;
            return newNode;
        }
        void moveToHead(Node *node){
            //移除
            node->prev->next=node->next;
            if(node->next){
                node->next->prev=node->prev;
            }
            //头插入
            node->next=this->head->next;
            this->head->next=node;
            node->prev=head;
            if(node->next){
                node->next->prev=node;
            }
        }
    };
     
    int main()
    {
        int T;
        scanf("%d", &T);
        for(int t=0; t<T; t++){
            NodeList *nodeList=new NodeList();
            map<int , Node*> nodeMap;
            int N;
            scanf("%d", &N);
            while(N--){
                int id;
                scanf("%d", &id);
                if(nodeMap.find(id)==nodeMap.end()){
                    nodeMap[id]=nodeList->addNode(id);
                }
                else{
                    nodeList->moveToHead(nodeMap[id]);
                }
            }
            Node *cur=nodeList->head;
            while(cur->next!=NULL){
                if(cur==nodeList->head){
                    printf("%d", cur->next->val);
                }
                else{
                    printf(" %d", cur->next->val);
                }
                cur=cur->next;
            }
            printf("\n");
        }
        return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:笔试刷题-网易2018-08-07

          本文链接:https://www.haomeiwen.com/subject/joonvftx.html