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

题意

数据流读入数字(保证>=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);
		}
	}
}

posted on 2019-06-15 00:00  coding_gaga  阅读(163)  评论(0编辑  收藏  举报

导航