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

相关推荐
小王不爱笑1326 分钟前
IO 模型
开发语言·python
短剑重铸之日24 分钟前
《ShardingSphere解读》07 读写分离:如何集成分库分表+数据库主从架构?
java·数据库·后端·架构·shardingsphere·分库分表
知我Deja_Vu25 分钟前
【避坑指南】ConcurrentHashMap 并发计数优化实战
java·开发语言·python
AI+程序员在路上34 分钟前
CANopen 协议:介绍、调试命令与应用
linux·c语言·开发语言·网络
2401_8318249635 分钟前
基于C++的区块链实现
开发语言·c++·算法
We་ct42 分钟前
LeetCode 918. 环形子数组的最大和:两种解法详解
前端·数据结构·算法·leetcode·typescript·动态规划·取反
愣头不青1 小时前
238.除了自身以外数组的乘积
数据结构·算法
人工智能AI酱1 小时前
【AI深究】逻辑回归(Logistic Regression)全网最详细全流程详解与案例(附大量Python代码演示)| 数学原理、案例流程、代码演示及结果解读 | 决策边界、正则化、优缺点及工程建议
人工智能·python·算法·机器学习·ai·逻辑回归·正则化
WangLanguager1 小时前
逻辑回归(Logistic Regression)的详细介绍及Python代码示例
python·算法·逻辑回归
m0_518019481 小时前
C++与机器学习框架
开发语言·c++·算法