zoukankan      html  css  js  c++  java
  • 程序员面试金典-面试题 10.10. 数字流的秩

    题目:

    假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作,也就是说:

    实现 track(int x) 方法,每读入一个数字都会调用该方法;

    实现 getRankOfNumber(int x) 方法,返回小于或等于 x 的值的个数。

    注意:本题相对原题稍作改动

    示例:

    输入:
    ["StreamRank", "getRankOfNumber", "track", "getRankOfNumber"]
    [[], [1], [0], [0]]
    输出:
    [null,0,null,1]
    提示:

    x <= 50000
    track 和 getRankOfNumber 方法的调用次数均不超过 2000 次

    分析:

    使用二分搜索树,节点额外存储该数字出现的次数,初始为1.

    程序:

    class StreamRank {
        private class Node{
            public Node left, right;
            int val;
            int nums;
            public Node(int val){
                this.val = val;
                nums = 1;
                left = null;
                right = null;
            }
        }
        private Node root;
    
        public StreamRank() {
            root = null;
        }
        
        public void track(int x) {
            root = add(root, x);
        }
        public Node add(Node node, int x) {
            if(node == null){
                return new Node(x);
            }
            if(x < node.val){
                node.left = add(node.left, x);
            }else if(x > node.val){
                node.right = add(node.right, x);
            }else{
                node.nums++;
            }
            return node;
        }
        
        public int getRankOfNumber(int x) {
            return find(root, x);
        }
        private int find(Node node, int x){
            if(node == null)
                return 0;
            int res = 0;
            if(node.val <= x){
                res += node.nums;
                res += find(node.right, x);
            }
            res += find(node.left, x);
            return res;
        }
    }
    
    /**
     * Your StreamRank object will be instantiated and called as such:
     * StreamRank obj = new StreamRank();
     * obj.track(x);
     * int param_2 = obj.getRankOfNumber(x);
     */
  • 相关阅读:
    HDU 1850 Being a Good Boy in Spring Festival
    UESTC 1080 空心矩阵
    HDU 2491 Priest John's Busiest Day
    UVALive 6181
    ZOJ 2674 Strange Limit
    UVA 12532 Interval Product
    UESTC 1237 质因子分解
    UESTC 1014 Shot
    xe5 android listbox的 TMetropolisUIListBoxItem
    xe5 android tts(Text To Speech)
  • 原文地址:https://www.cnblogs.com/silentteller/p/12488170.html
Copyright © 2011-2022 走看看