首页 > 其他 > 详细

[程序员代码面试指南]第9章-一种消息接收并打印的结构(链表)

时间:2019-06-15 01:07:22      阅读:115      评论:0      收藏:0      [点我收藏+]

题意

数据流读入数字(保证>=1),i最初=0,当i+1出现时,输出i+1及其后连续的输入过的数字,否则什么也不输出。
例子:
输入:1 输出:1
输入:3 输出:
输入:4 输出:
输入:6 输出:
输入:2 输出:2 3 4

题解

用链表+headMap+tailMap存。
总时间复杂度O(n).

代码

import java.util.HashMap;
import java.util.Scanner;

class Node{
    int val;
    Node next;
    public Node(int val) {
        this.val=val;
    }
}

class Message{
    HashMap<Integer,Node> headMap=new HashMap();
    HashMap<Integer,Node> tailMap=new HashMap();
    int lastPrint=0;
    
    public void receive(int num) {
        Node node=new Node(num);
        headMap.put(num, node);
        tailMap.put(num,node);
        
        if(headMap.containsKey(num+1)) {
            node.next=headMap.get(num+1);
            headMap.remove(num+1);
            headMap.put(num,node);
        }
        if(tailMap.containsKey(num-1)) {
            tailMap.get(num-1).next=node;
            tailMap.remove(num-1);
            tailMap.put(num,node);
        }
        if(headMap.containsKey(lastPrint+1)) {
            print();
        }
    }
    
    private void print() {//
        Node node=headMap.get(lastPrint+1);
        headMap.remove(lastPrint+1);
        while(node.next!=null) {
            System.out.println(node.val);
            ++lastPrint;
            node=node.next;
        }
        System.out.println(node.val);
        ++lastPrint;
        tailMap.remove(node.val);
    }
}

public class Main {
    public static void main(String args[]) {
        Scanner in=new Scanner(System.in);
        Message mes=new Message();
        while(in.hasNext()) {
            int num=in.nextInt();
            mes.receive(num);
        }
    }
}

[程序员代码面试指南]第9章-一种消息接收并打印的结构(链表)

原文:https://www.cnblogs.com/coding-gaga/p/11025993.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!