• [程序员代码面试指南]第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);
    		}
    	}
    }
    
  • 相关阅读:
    【机器学习】浅谈协方差
    python {}.format
    【机器学习】准确率、精确率、召回率
    【声纹识别】 EER
    【机器学习】 最形象的入门
    逻辑卷-LVM
    RAID及软RAID的实现
    输入数字or 字符串,统计重复次数---字典统计练习
    Python-数据结构之dict(字典*****)
    POJ 3204 网络流的必须边
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/11025993.html
Copyright © 2020-2023  润新知