怒刷LeetCode的第10天(Java版)

news2025/1/13 10:29:42

目录

第一题

题目来源

题目内容

解决方法

方法一:两次拓扑排序

第二题

题目来源

题目内容

解决方法

方法一:分治法

方法二:优先队列(Priority Queue)

方法三:迭代

第三题

题目来源

题目内容

解决方法

方法一:迭代

方法二:递归

方法三:双指针

方法四:栈


第一题

题目来源

2603. 收集树中金币 - 力扣(LeetCode)

题目内容

解决方法

方法一:两次拓扑排序

这个解法的思路如下:

  1. 首先,初始化一个邻接表 g,用于存储树的结构,以及一个数组 degree,用于记录每个节点的度数。
  2. 遍历边的数组 edges,将每条边的两个节点之间建立连接关系,并更新节点的度数。
  3. 初始化一个队列 queue,用于存储无金币的叶子节点。
  4. 遍历所有节点,如果一个节点的度数为1并且该节点没有金币,则将其加入队列。
  5. 开始循环,直到队列为空。在每次迭代中,取出队列的首个节点 u。
  6. 将节点 u 的度数减1,剩余节点数 rest 减1。
  7. 遍历与节点 u 相邻的所有节点 v,将其度数减1。
  8. 如果节点 v 的度数为1并且该节点没有金币,则将其加入队列。
  9. 重复步骤 5-8,直到队列为空。
  10. 重复两次以下步骤(总共遍历两次): a. 初始化一个新的队列 queue。 b. 遍历所有节点,将度数为1的节点加入队列。 c. 开始循环,直到队列为空。 d. 取出队列的首个节点 u,将其度数减1,剩余节点数 rest 减1。 e. 遍历与节点 u 相邻的所有节点 v,将其度数减1。 f. 重复步骤 d-e,直到队列为空。
  11. 返回结果,如果剩余节点数 rest 为0,则路径长度为0;否则,路径长度为 (rest - 1) * 2。

这样,通过删除树中无金币的叶子节点和维护节点的度数,可以得到最小路径长度。

class Solution {
    public int collectTheCoins(int[] coins, int[][] edges) {
        int n = coins.length;
        List<Integer>[] g = new List[n];
        for (int i = 0; i < n; ++i) {
            g[i] = new ArrayList<Integer>();
        }
        int[] degree = new int[n];
        for (int[] edge : edges) {
            int x = edge[0], y = edge[1];
            g[x].add(y);
            g[y].add(x);
            ++degree[x];
            ++degree[y];
        }

        int rest = n;
        /* 删除树中所有无金币的叶子节点,直到树中所有的叶子节点都是含有金币的 */
        Queue<Integer> queue = new ArrayDeque<Integer>();
        for (int i = 0; i < n; ++i) {
            if (degree[i] == 1 && coins[i] == 0) {
                queue.offer(i);
            }
        }
        while (!queue.isEmpty()) {
            int u = queue.poll();
            --degree[u];
            --rest;
            for (int v : g[u]) {
                --degree[v];
                if (degree[v] == 1 && coins[v] == 0) {
                    queue.offer(v);
                }
            }
        }
        /* 删除树中所有的叶子节点, 连续删除2次 */
        for (int x = 0; x < 2; ++x) {
            queue = new ArrayDeque<Integer>();
            for (int i = 0; i < n; ++i) {
                if (degree[i] == 1) {
                    queue.offer(i);
                }
            }
            while (!queue.isEmpty()) {
                int u = queue.poll();
                --degree[u];
                --rest;
                for (int v : g[u]) {
                    --degree[v];
                }
            }
        }

        return rest == 0 ? 0 : (rest - 1) * 2;
    }
}

复杂度分析:

1、构建邻接表和计算节点度数的复杂度:

  • 遍历边的数组 edges,时间复杂度为 O(m),其中 m 是边的数量。
  • 初始化邻接表 g 的空间复杂度为 O(n),其中 n 是节点的数量。
  • 更新节点度数的过程需要遍历所有边,时间复杂度为 O(m)。

2、删除无金币叶子节点的过程的复杂度:

  • 初始化队列的时间复杂度为 O(n),其中 n 是节点的数量。
  • 每个节点最多被处理一次,因此删除过程的时间复杂度为 O(n)。

3、连续删除两次叶子节点的过程的复杂度:

  • 需要进行两次完整的节点遍历,因此时间复杂度为 O(2n) = O(n),其中 n 是节点的数量。

综上所述,整个解法的时间复杂度为 O(m + n),其中 m 是边的数量,n 是节点的数量。空间复杂度为 O(n),用于存储邻接表和节点度数。

LeetCode运行结果:

第二题

题目来源

23. 合并 K 个升序链表 - 力扣(LeetCode)

题目内容

解决方法

方法一:分治法

这是一个合并K个升序链表的问题,可以使用分治法来解决。使用了分治法来将k个链表分成两部分进行合并,然后再将合并后的结果继续与剩下的链表合并,直到最终合并成一个升序链表。在每个合并的过程中,可以使用双指针来逐个比较两个链表的节点值,将较小的节点连接到结果链表上。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
public class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if (lists == null || lists.length == 0) {
            return null;
        }

        return merge(lists, 0, lists.length - 1);
    }

    private ListNode merge(ListNode[] lists, int start, int end) {
        if (start == end) {
            return lists[start];
        }

        int mid = start + (end - start) / 2;
        ListNode left = merge(lists, start, mid);
        ListNode right = merge(lists, mid + 1, end);

        return mergeTwoLists(left, right);
    }

    private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        }
        if (l2 == null) {
            return l1;
        }

        if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    }
}

复杂度分析:

  • 这个解法的时间复杂度是 O(Nlogk),其中 N 是所有链表的节点总数,k 是链表的数量。因为在每层合并的过程中,需要遍历 N 个节点来比较值,并且每次合并的链表数量减半,因此总共需要合并 logk 层。所以时间复杂度是 O(Nlogk)。
  • 空间复杂度是 O(logk),主要是递归调用栈的空间。在每一层递归中,都会创建两个新的递归函数调用,所以递归的层数最多是 logk。因此,空间复杂度是 O(logk)。

需要注意的是,这里的空间复杂度是指除了返回的合并后的链表之外的额外空间使用量。

LeetCode运行结果:

方法二:优先队列(Priority Queue)

使用了优先队列来维护当前k个链表中的最小节点。首先,将所有链表的头节点加入到优先队列中。然后,不断从优先队列中取出最小的节点,将其加入到合并后的链表中,并将该节点的下一个节点加入到队列中。重复这个过程直到队列为空。 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
public class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if (lists == null || lists.length == 0) {
            return null;
        }

        // 创建一个优先队列,按照节点值的大小进行排序
        PriorityQueue<ListNode> queue = new PriorityQueue<>((a, b) -> a.val - b.val);

        // 将所有链表的头节点加入到优先队列中
        for (ListNode node : lists) {
            if (node != null) {
                queue.offer(node);
            }
        }

        // 创建一个dummy节点作为合并后的链表头部
        ListNode dummy = new ListNode(0);
        ListNode curr = dummy;

        // 不断从优先队列中取出最小的节点,将其加入到合并后的链表中,然后将该节点的下一个节点加入到队列中
        while (!queue.isEmpty()) {
            ListNode node = queue.poll();
            curr.next = node;
            curr = curr.next;

            if (node.next != null) {
                queue.offer(node.next);
            }
        }

        return dummy.next;
    }
}

复杂度分析:

  • 这个基于优先队列的解法的时间复杂度是O(Nlogk),其中N是所有链表的节点总数,k是链表的数量。主要的时间消耗在于构建优先队列和从队列中取出最小节点,而构建优先队列的时间复杂度是O(klogk),每次取出最小节点的操作时间复杂度是O(logk)。由于总共需要取出N个节点,因此总体的时间复杂度是O(Nlogk)。
  • 空间复杂度是O(k),主要是优先队列所占用的空间。在最坏情况下,优先队列中最多会有k个节点,因此空间复杂度是O(k)。

需要注意的是,这里的空间复杂度是指除了返回的合并后的链表之外的额外空间使用量。

LeetCode运行结果:

方法三:迭代

使用了迭代的方式逐一合并链表。

  1. 首先设定一个变量 interval,初始值为1,表示每次合并的链表数量。
  2. 然后进行循环,直到 interval 大于等于链表数组的长度。在每次循环中,按照 interval 的步长对链表数组进行逐一合并。每次合并两个链表,将合并结果放回原始数组的相应位置。
  3. 通过每次将 interval 值翻倍,循环进行迭代合并,直到 interval 大于等于链表数组的长度,最终得到合并后的链表。
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if (lists == null || lists.length == 0) {
            return null;
        }
        
        int interval = 1;
        while (interval < lists.length) {
            for (int i = 0; i + interval < lists.length; i += 2 * interval) {
                lists[i] = mergeTwoLists(lists[i], lists[i + interval]);
            }
            interval *= 2;
        }
        
        return lists[0];
    }
    
    private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0);
        ListNode curr = dummy;
        
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                curr.next = l1;
                l1 = l1.next;
            } else {
                curr.next = l2;
                l2 = l2.next;
            }
            curr = curr.next;
        }
        
        if (l1 != null) {
            curr.next = l1;
        }
        
        if (l2 != null) {
            curr.next = l2;
        }
        
        return dummy.next;
    }
}

复杂度分析:

  • 时间复杂度:这个解法的时间复杂度是O(Nklogk),其中N是每个链表的平均长度,k是链表的数量。通过每次将 interval 值翻倍,循环进行迭代合并,直到 interval 大于等于链表数组的长度,最终得到合并后的链表。在每一层循环中的操作总时间复杂度仍然是O(Nk),因为每一层的合并操作需要遍历所有链表节点。
  • 空间复杂度:这个解法的空间复杂度是O(1),没有使用额外的数据结构。只需要常数级别的额外空间来保存临时变量。

综上所述,优先队列解法和分治法解法的时间复杂度相同,但优先队列解法的空间复杂度略高于分治法解法。而迭代解法的时间复杂度稍高于前两种解法,并且空间复杂度较低。

LeetCode运行结果:

第三题

题目来源

24. 两两交换链表中的节点 - 力扣(LeetCode)

题目内容

解决方法

方法一:迭代

迭代的思路是遍历链表,每次处理两个相邻节点进行交换。具体步骤如下:

1、定义一个哑节点(dummy)作为新链表的头节点,并将其指向原始链表的头节点head。

2、定义一个指针prev指向哑节点,用于连接新链表中的节点。

3、当原始链表中至少有两个节点时,重复以下操作:

  • 使用指针curr1指向当前要交换的第一个节点,即prev.next。
  • 使用指针curr2指向当前要交换的第二个节点,即curr1.next。
  • 将prev的下一个节点指向curr2,完成节点交换。
  • 将curr1的下一个节点指向curr2的下一个节点,完成节点交换。
  • 将curr2的下一个节点指向curr1,完成节点交换。
  • 更新prev指针和curr1指针,使它们分别指向交换后的第二个节点和下一组要交换的第一个节点。

4、返回哑节点(dummy)的下一个节点作为新链表的头节点。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
public ListNode swapPairs(ListNode head) {
    ListNode dummy = new ListNode(0);
    dummy.next = head;
    ListNode prev = dummy;
    
    while (head != null && head.next != null) {
        ListNode curr1 = head;
        ListNode curr2 = head.next;
        
        prev.next = curr2;
        curr1.next = curr2.next;
        curr2.next = curr1;
        
        prev = curr1;
        head = curr1.next;
    }
    
    return dummy.next;
}

}

复杂度分析:

  • 时间复杂度:O(n),其中n是链表中的节点数。需要遍历链表中的每个节点一次。
  • 空间复杂度:O(1)。只需要常数级别的额外空间。

LeetCode运行结果:

方法二:递归

递归的思路是将链表分成两部分:第一个节点和剩余节点。然后,交换这两部分,并递归地对剩余节点进行两两交换。具体步骤如下:

  1. 当链表为空或只有一个节点时,无需交换,直接返回该节点。
  2. 令first指向链表的头节点,second指向first的下一个节点。
  3. 交换first和second节点,即将second的next指向first,并将first的next指向递归处理剩余节点的结果。
  4. 返回second节点作为新链表的头节点。
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
public ListNode swapPairs(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    
    ListNode first = head;
    ListNode second = head.next;
    
    first.next = swapPairs(second.next);
    second.next = first;
    
    return second;
}
}

复杂度分析:

  • 时间复杂度:O(n),其中n是链表中的节点数。每次递归都会处理一个节点,并且递归调用的层数最多为n/2。
  • 空间复杂度:O(n),其中n是链表中的节点数。递归调用的栈空间最多为n/2。

LeetCode运行结果:

方法三:双指针

除了递归和迭代之外,还可以使用双指针的方法来交换链表中的节点。该方法使用两个指针prev和curr分别指向当前要交换的两个节点的前一个节点和第一个节点。通过不断地交换节点,并更新指针,实现链表中节点的两两交换。

注意:它与迭代方法的思路类似,但在细节上有所改动。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
public ListNode swapPairs(ListNode head) {
    // 创建哑节点(dummy)作为新链表的头节点,并将其指向原始链表的头节点head
    ListNode dummy = new ListNode(0);
    dummy.next = head;
    
    // 定义两个指针prev和curr,分别指向当前要交换的两个节点的前一个节点和第一个节点
    ListNode prev = dummy;
    ListNode curr = head;
    
    while (curr != null && curr.next != null) {
        // 获取要交换的两个节点
        ListNode node1 = curr;
        ListNode node2 = curr.next;
        
        // 进行节点交换
        prev.next = node2;
        node1.next = node2.next;
        node2.next = node1;
        
        // 更新prev和curr指针,进行下一组节点交换
        prev = node1;
        curr = node1.next;
    }
    
    return dummy.next;
}

}

复杂度分析:

  • 时间复杂度:O(n)  遍历链表中的每个节点一次,所以时间复杂度是线性的。
  • 空间复杂度:O(1)  只使用了常数级别的额外空间,不随输入规模增加而变化。

LeetCode运行结果:

方法四:栈

除了递归、双指针和迭代之外,还可以使用栈来实现链表节点的两两交换。

这种栈的方法将链表中的节点依次入栈,每次栈中至少有两个节点时,就进行交换操作。通过维护栈来实现链表节点的两两交换。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
public ListNode swapPairs(ListNode head) {
    // 创建一个栈
    Deque<ListNode> stack = new ArrayDeque<>();
    ListNode dummy = new ListNode(0);
    dummy.next = head;
    
    ListNode curr = dummy;
    
    while (curr != null && curr.next != null) {
        // 将当前节点的后继节点和后继的后继节点入栈
        stack.push(curr.next);
        stack.push(curr.next.next);
        
        // 当栈中至少有两个节点时,进行节点交换
        if (stack.size() >= 2) {
            curr.next = stack.pop();
            curr.next.next = stack.pop();
            curr = curr.next.next;
        } else {
            break;
        }
    }
    
    return dummy.next;
}

}

复杂度分析:

  • 时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表中的每个节点一次。
  • 空间复杂度:O(n),需要使用一个栈来存储节点。

需要注意的是,递归的深度与链表的长度相关,当链表较长时可能会导致栈溢出,因此在实际使用时需要注意链表的长度限制。如果链表长度较大,建议使用其他方法实现节点的交换。

LeetCode运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浙江大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作——2023学生开学季辉少许

浙江大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作——2023学生开学季辉少许

Vulnhub系列靶机-Infosec_Warrior1

文章目录 Vulnhub系列靶机-Infosec_Warrior11. 信息收集1.1 主机扫描1.2 端口扫描1.3 目录爆破 2. 漏洞探测3. 漏洞利用4. 权限提升 Vulnhub系列靶机-Infosec_Warrior1 1. 信息收集 1.1 主机扫描 arp-scan -l1.2 端口扫描 nmap -A -p- 192.168.188.191发现22端口和80端口是…

数据结构和算法(8):搜索树(二叉搜索树和AVL树)

查找 所谓的查找或搜索&#xff0c;指从一组数据对象中找出符合特定条件者&#xff0c;这是构建算法的一种基本而重要的操作。其中的数据对象&#xff0c;统一地表示和实现为 词条&#xff08;entry&#xff09; 的形式&#xff1b;不同词条之间&#xff0c;依照各自的 关键码…

C++之类和函数权限访问总结(二百二十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

软件的开发步骤,需求分析,开发环境搭建,接口文档 ---苍穹外卖1

目录 项目总览 开发准备 开发步骤 角色分工 软件环境 项目介绍 产品原型 技术选型 开发环境搭建 前端:默认已有 后端 使用Git版本控制 数据库环境搭建 前后端联调 ​登录功能完善 导入接口文档 使用swagger​ 和yapi的区别 常用注解 项目总览 开发准备 开发步骤…

用tkinter+selenium做一个CSDN热榜爬虫

文章目录 UI设计函数封装功能实现 自从学会了分析热榜&#xff0c;就是CSDN热榜分析&#xff0c;每天都要爬下来分析一下热榜都在干什么。但脚本运行到底还是不方便&#xff0c;所以接下来就想办法将其做成一个带有界面的热榜爬虫 UI设计 做一个热榜爬虫的交互式界面&#xf…

IOS版微信8.0.42正式版已推出:新增多语言“翻译”!

微信最近的更新的真的很快&#xff0c;包括Mac、iPhone、PC端以及安卓版本都进行了更新推送。 微信iOS 8.0.42正式版已经向公众开放&#xff0c;这个新版本在原有功能的基础上&#xff0c;对群管理界面、翻译功能、小程序等方面进行了优化和改进&#xff0c;让用户的使用体验更…

嵌入式Linux--进程间通信--共享内存

1. 回顾之前的通信内容&#xff1a; 进程间通信主要有5种通信方式 1、无名管道&#xff08;只能单向发送或接收&#xff09; 2、命名管道&#xff08;同上&#xff09; 3、消息队列&#xff08;可以发送&#xff0c;也能接收消息&#xff09; 4、共享内存&#xff08;有一块公…

呼叫中心系统角色功能的应用

呼叫中心系统拥有强大的功能&#xff0c;根据角色不同能够使用的功能也是不同的&#xff0c;按规则是角色权限越大&#xff0c;可以使用的功能也越多。如普通坐席最重要的工作就是接打电话&#xff0c;没必要使用全部功能&#xff0c;只需有几个话务相关功能就足够了&#xff0…

phpstudy RCE脚本编写(Python)

文章目录 编写过程脚本优化 编写过程 关于phpstudy 2016-2018 RCE漏洞的验证&#xff0c;请移步我的这篇博客 phpstudy2016 RCE漏洞验证。 将之前漏洞验证的数据包复制下来&#xff0c;编写脚本时需要使用&#xff1a; GET /phpinfo.php HTTP/1.1 Host: 10.9.75.164 Upgrade…

无涯教程-JavaScript - SERIESSUM函数

描述 SERIESSUM函数返回幂级数的总和。幂级数展开可近似许多功能。 语法 SERIESSUM (x, n, m, coefficients)争论 Argument描述Required/OptionalXThe input value to the power series.RequiredNThe initial power to which you want to raise x.RequiredMThe step by whi…

找不到名称 “$“。是否需要安装 jQuery 的类型定义? 请尝试使用 `npm i --save-dev @types/jquery`。

vitevue3环境 1、安装jQuery npm install --save jquery 2、在main.ts文件进行配置 declare const window: any; import jQuery from jquery; window.$ window.jQuery jQuery; 注意&#xff1a;需要声明window属性&#xff1b; 要不然会报错&#xff1a;类型“Window &am…

八、数据类型转换

数据类型转换 1.数据类型转换1.1.隐式类型转换1.2.显式类型转换1.3.训练11.4.训练2 —————————————————————————————————————————————————— 1.数据类型转换 类型转换是将一个值从一种类型更改为另一种类型的过程。例如&…

Navicat 武林小秘籍 | 如何在数据同步期间查看源和目标之间的数据差异

可应用操作系统&#xff1a;Windows、macOS、Linux 可应用 Navicat 产品&#xff1a;Navicat for MySQL、Navicat for PostgreSQL、Navicat for Oracle、Navicat for SQL Server、Navicat for MariaDB、Navicat for SQLite、Navicat for MongoDB、Navicat Premium 可应用 Nav…

【记录】Python 之于 C/C++ 区别

记录本人在 Python 上经常写错的一些地方&#xff08;C/C 写多了&#xff0c;再写 Python 有点切换不过来&#xff09; 逻辑判断符号用 and、or、!可以直接 10 < num < 30 比较大小分支语句&#xff1a;if、elif、else使用 、-&#xff0c;Python 中不支持 、- - 这两个…

LVS 负载均衡集群的DR模式配置

集群 集群的概述 集群技术是一种用于提高系统性能、可用性、容错性和可扩展性的关键方法。它涉及将多个计算资源或节点组合在一起&#xff0c;以协同工作以处理任务、服务请求或数据处理。 集群类型 无论是哪种集群&#xff0c;都至少包括两台节点服务器&#xff0c;而对外…

AB实验总结

互联网有线上系统&#xff0c;可做严格的AB实验。传统行业很多是不能做AB实验的。 匹配侧是采用严格的AB实验来进行模型迭代&#xff0c;而精细化定价是不能通过AB实验来评估模型好坏&#xff0c;经历过合成控制法、双重差分法&#xff0c;目前采用双重差分法来进行效果评估。…

无涯教程-JavaScript - MROUND函数

描述 MROUND函数返回一个舍入为所需倍数的数字。 MROUND函数是Excel中的15个舍入函数之一。 语法 MROUND (number, multiple)争论 Argument描述Required/OptionalNumberThe value to round.RequiredMultipleThe multiple to which you want to round number.Required Note…

如何使用chorme版本对应的ChromeDriver(不用更改Chrome版本)

为什么要这样 我们发现在 官网 下载ChromeDriver的地方&#xff0c;没有对于高版本的下载包&#xff0c;可是我们的浏览器版本是 117.0.5938.88&#xff0c;我又不想降低本地的Chrome版本&#xff0c;因为这样也太蠢了&#xff0c;每次更新后可能老版本就不适用了。 使用方法 …

9.2.3.1 【MySQL】XDES Entry链表

当段中数据较少的时候&#xff0c;首先会查看表空间中是否有状态为 FREE_FRAG 的区&#xff0c;也就是找还有空闲空间的碎片区&#xff0c;如果找到了&#xff0c;那么从该区中取一些零碎的页把数据插进去&#xff1b;否则到表空间下申请一个状态为 FREE 的区&#xff0c;也就是…