算法题java

一、四向链表,输入n生成一个多维4向链表

java 复制代码
    @Data
    static class ListNode<T>{
        private T val;
        ListNode<T> up,down,left,right;
        public ListNode(T val){
            this.val = val;
        }
    }
    public static void main(String[] args){
        ListNode<Integer> node = getResult(8);
        ListNode<Integer> row = node;
        while(row != null){
            ListNode currNode = row;
            while(currNode != null){
                System.out.print(currNode.val + "  ");
                currNode = currNode.right;
            }
            System.out.println("");
            row = row.down;
        }

    }
    public static ListNode<Integer> getResult(int n){
        if(n<=0){
            return null;
        }
        ListNode<Integer> head = new ListNode<>(11);
        head.left = null;
        head.up = null;
        ListNode<Integer> current = head;
        for(int i = 2 ; i <= n ; i++){
            ListNode<Integer> node = new ListNode<>(10 + i);
            current.right = node;
            node.left = current;
            current = node;
        }
        ListNode<Integer> prevHead = head;
        ListNode<Integer> rowCurrent = prevHead;
        for(int row = 2 ; row <= n ; row++){
            ListNode<Integer> rowHead = new ListNode<>(row * 10 + 1);
            prevHead.down = rowHead;
            rowHead.up = prevHead;
            current = rowHead;
            for(int col = 2; col <= n ; col++){
                ListNode<Integer> node = new ListNode<>(row * 10 + col);
                node.left = current;
                current.right = node;
                rowCurrent = rowCurrent.right;
                rowCurrent.down = node;
                node.up = rowCurrent;
                current = node;
            }
            prevHead = rowHead;
            rowCurrent = prevHead;
        }
        return head;
    }

二、输入树高,生成一个满二叉树。BinaryTree

java 复制代码
 static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode parent;
        public TreeNode(int val) {
            this.val = val;
            this.left = null;
            this.right = null;
            this.parent = null;
        }
    }
    public static TreeNode generate(TreeNode parent,int depth) {
        if (depth == 0) {
            return null;
        }
        TreeNode node = new TreeNode(depth);
        node.left = generate(node,depth - 1);
        node.right = generate(node,depth - 1);
        node.parent = parent;
        return node;
    }
    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        root = generate(root,3);
        printTree(root);
    }
    public static void printTree(TreeNode root) {
        if (root == null) {
            return;
        }
        System.out.print(root.val + " ");
        printTree(root.left);
        printTree(root.right);
    }

其它方式参考:https://blog.csdn.net/wellsoonqmail/article/details/128262114

三、java实现双链表

java 复制代码
static class ListNode{
        private int val;//值
        private ListNode prev;//前驱
        private ListNode next;//后继

        public ListNode(int val){
            this.val=val;
        }
    }
    public ListNode head;//双向链表的头节点
    public ListNode last;//双向链表的尾节点
    public void display(){
        ListNode cur=head;
        while(cur!=null){
            System.out.print(cur.val+" ");
            cur=cur.next;
        }
        System.out.println();
    }
    public int size(){
        ListNode cur=head;
        int count=0;
        while(cur!=null){
            count++;
            cur=cur.next;
        }
        return count;
    }
    public void addFirst(int data) {
        ListNode node = new ListNode(data);
        //链表为空时
        if (head == null) {
            head = node;
            last = node;
        }
        //有头指针,不为空
        else {
            node.next = head;
            head.prev = node;
            head = node;
        }
    }
    public void addLast(int data){
        ListNode node=new ListNode(data);
        //当链表为空
        if(head==null){
            head=node;
            last=node;
        }
        //有头指针,不为空
        else{
            last.next=node;
            node.prev=last;
            last=last.next;
        }
    }
    //删除第一次出现关键字key的节点,一共三种情况
    public void remove(int key){
        ListNode cur = head;
        while (cur != null) {
            if(cur.val == key) {
                //1.当删除头节点
                if(cur == head) {
                    head = head.next;
                    //1.1当头指针不为空时
                    if(head != null) {
                        //考虑只有一个节点的情况下
                        head.prev = null;
                    }else {
                        //1.2头指针为空时
                        last = null;
                    }
                }else {
                    //2.删除中间节点 和  3.尾巴节点
                    if(cur.next != null) {
                        //删除中间节点
                        cur.prev.next = cur.next;
                        cur.next.prev = cur.prev;
                    }else {
                        //尾巴节点
                        cur.prev.next = cur.next;
                        last = last.prev;
                    }
                }
                return;
            }else {
                cur = cur.next;
            }
        }
    }

参照:https://blog.csdn.net/m0_63732435/article/details/127195219

四、假设有n个面试官,每个面试者预约的时间是[ai, bi](包括边界),1号面试官在bi时刻结束后,至多能继续bi+1时刻开始的面试,请帮忙计算1号面试官至多能面试多少个面试者。//贪婪策略:每次选择最早结束的活动

java 复制代码
private static int [][] times = {{1,3},{1,4},{3,5},{4,5}};
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Arrays.sort(times, (o1, o2) -> {
            if(o1[1] == o2[1]){
                return o1[0] - o2[0];
            }else{
                return o1[1] - o2[1];
            }
        });
        int res = 1;
        int end = times[0][1];
        for(int i = 1; i < n; i++){
            if(times[i][0] > end){
                end = times[i][1];
                res++;
            }
        }
        System.out.println(res);
    }

参照:https://blog.csdn.net/qq_45908682/article/details/124661279

贪婪算法:https://blog.csdn.net/TuttuYYDS/article/details/124636914

相关推荐
不绝19115 小时前
C#核心——面向对象:封装
开发语言·javascript·c#
没有bug.的程序员15 小时前
HashMap 源码深度剖析:红黑树转换机制与高并发性能陷阱
java·性能优化·并发编程·源码分析·红黑树·hashmap·技术深度
想逃离铁厂的老铁15 小时前
Day43 >> 300.最长递增子序列 + 674. 最长连续递增序列+ 718. 最长重复子数组
数据结构·算法
Yzzz-F15 小时前
P6648 [CCC 2019] Triangle: The Data Structure [st表]
算法
yaoxin52112315 小时前
294. Java Stream API - 对流进行归约
java·开发语言
ghie909015 小时前
基于MATLAB的演化博弈仿真实现
开发语言·matlab
曹轲恒15 小时前
Thread.sleep() 方法详解
java·开发语言
aini_lovee15 小时前
基于Qt实现CAN通信上位机
开发语言·qt
Coder_Boy_15 小时前
基于SpringAI的在线考试系统-考试模块前端页面交互设计及优化
java·数据库·人工智能·spring boot
小小仙。15 小时前
IT自学第十九天
java·开发语言