算法题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

相关推荐
AitTech7 分钟前
C#编程:List.ForEach与foreach循环的深度对比
开发语言·c#·list
路上阡陌9 分钟前
Java学习笔记(二十四)
java·笔记·学习
带多刺的玫瑰10 分钟前
Leecode刷题C语言之收集所有金币可获得的最大积分
算法·深度优先
LabVIEW开发16 分钟前
PID控制的优势与LabVIEW应用
算法·labview
何中应18 分钟前
Spring Boot中选择性加载Bean的几种方式
java·spring boot·后端
苏苏大大21 分钟前
zookeeper
java·分布式·zookeeper·云原生
阿俊仔(摸鱼版)22 分钟前
Python 常用运维模块之OS模块篇
运维·开发语言·python·云服务器
军训猫猫头23 分钟前
56.命令绑定 C#例子 WPF例子
开发语言·c#·wpf
sunly_30 分钟前
Flutter:自定义Tab切换,订单列表页tab,tab吸顶
开发语言·javascript·flutter
远方 hi40 分钟前
linux虚拟机连接不上Xshell
开发语言·php·apache