题解 | #牛牛的跳表设计#

牛牛的跳表设计

https://www.nowcoder.com/practice/6f1858d268634e2ca453b1cccbd19dc0

import java.util.*;


public class Solution {
    public static int max_deep = 10;
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param operations int整型二维数组
     * @param data int整型二维数组
     * @return bool布尔型一维数组
     */
    class NodeT {
        private NodeT down;
        private NodeT pro;
        private NodeT next;
        private int val;

        public NodeT (int val) {
            this.val = val;
        }

        public NodeT () {
        }

        public NodeT (int val, NodeT down, NodeT pro, NodeT next) {
            this.val = val;
            this.down = down;
            this.pro = pro;
            this.next = next;
        }

//        @Override
//        public  String toString(){
//
//            return this.val + ";" +this.next.val +  ";" +this.down.val;
//        }
    }
    
    class Skiplist {
        NodeT node;
        public Skiplist() {
            this.node = new NodeT(-1);
            //第一个节点建立10级索引,
            int k = max_deep;
            NodeT temp = node;
            while (k > 0) {
                temp.down = new NodeT(-1);
                temp = temp.down;
                k--;
            }

        };
        boolean search(int target) {
            NodeT temp = node;
            while (temp != null) {
                while (temp.next != null && temp.next.val < target) {
                    temp = temp.next;
                }
                if (temp.val == target || (temp.next != null && temp.next.val == target)) return true;
                temp = temp.down;
            }
            return false;
        }; // 返回target是否存在于跳表中。

        void add(int num) {
            //随机生成0-10级索引,
            int k = new Random().nextInt(max_deep);
            NodeT temp = node;
            int index = max_deep;
            NodeT tp = null;
            while (index >= 0) {
                while (temp.next != null && temp.next.val < num) {
                    temp = temp.next;
                }
                if (index <= k) {
                    //插入索引
                    NodeT nodet = new NodeT(num);
                    nodet.next = temp.next;
                    if (temp.next != null) temp.next.pro = nodet;
                    nodet.pro = temp;
                    temp.next = nodet;

                    if (tp != null) tp.down = nodet;
                    tp = nodet;
                }
                temp = temp.down;
                index--;
            }
        }; // 插入一个元素到跳表。 插入成功输出true
        boolean erase(int num) {
            //找到后后面的k级索引都要删除
            NodeT temp = node;
            boolean flag = false;
            while (temp != null) {
                while (temp.next != null && temp.next.val < num) {
                    temp = temp.next;
                }
                if(temp.next != null && temp.next.val == num) {
                    temp = temp.next;
                }
                if (temp.val == num) {
                    //删除第k级索引
                    flag = true;
                    temp.pro.next = temp.next;
                }
                temp = temp.down;
            }
            return flag;
        };// 在跳表中删除一个值,如果 num 不存在,直接返回false. 如果存在多个 num ,删除其中任意一个即可。
    };
    public boolean[] performOperations (int[][] operations, int[][] data) {
        List<Boolean> list = new ArrayList<>();
        Skiplist skiplist = new Skiplist();
        for (int i = 0; i < operations.length; i++) {
            if (operations[i][0] == 0) {
                list.add(skiplist.search(data[i][0]));
            } else if (operations[i][0] == 1) {
                skiplist.add(data[i][0]);
                list.add(true);  // add 操作返回 true
            } else if (operations[i][0] == 2) {
                list.add(skiplist.erase(data[i][0]));
            }
        }
        boolean[] res = new boolean[list.size()];
        for (int i = 0; i < res.length; i++) {
            res[i] = list.get(i);
        }
        return res;// write code here
    }
}

全部评论

相关推荐

05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务