当前位置: 首页 > news >正文

[牛客Hot101]链表篇

文章目录

    • 1.翻转链表
    • 2.链表内指定区间翻转
    • 3. 链表中的节点每k个一组翻转
    • 4. 合并两个排序的链表
    • 5. 合并k个排序的链表
    • 6. 判断链表是否有环
    • 7. 链表中倒数第k个节点
    • 8. 删除链表中的倒数第k和节点
    • 9. 两个链表的第一个公共节点
    • 10.链表的入环节点
    • 11. 链表相加(二)
    • 12. 单链表排序
    • 13.判断一个链表是否是回文结构
    • 14. 链表的奇偶重排
    • 15.删除有序链表中重复的元素I
    • 16.删除有序链表中重复的元素||

1.翻转链表

在这里插入图片描述

❤️❤️ 算法思路: 设置一个指针pre,这个pre指向的是工作节点也就是在链表中挨个遍历的cur的前一个节点,初始的时候设置pre指向为null,因为要翻转链表,链表中的最后一个节点指向为null。逐个遍历链表中的每一个节点,每次遍历节点的前一个节点。curNext = cur.next 然后节点指定翻转当前节点指向前一个节点 cur.next = pre,然后更新pre的指向,指向为cur 即 pre = cur 然后工作节点cur 继续遍历链表的后续节点。

//翻转链表
public Node reverse(Node head){if(head == null || head.next == null){return head;}Node cur = head;Node curNext = null;Node pre = null;while (cur != null){//记录当前节点的后置节点curNext = cur.next;//当前节点的next指针指向前置节点,那么此时就实现了一个节点的翻转cur.next = pre;//前置节点指向更新pre = cur;//当前节点继续遍历cur = curNext;}//.最后cur 为空,pre是cur 的前置节点,那么此时的pre就是翻转后链表的头节点return pre;
}

2.链表内指定区间翻转

在这里插入图片描述

❤️❤️ 算法思路: 其实就是翻转链表的一个变种,翻转链表的一部分,找到翻转链表的头节点和尾节点,还有就是翻转链表头节点的前一个节点和翻转链表的最后一个节点的后一个节点。把部分链表翻转之后,进行拼接。
在这里插入图片描述

//翻转链表中的一部分
public Node reverseSub(Node head,int m,int n){if(head == null || head.next == null || m == n){return head;}Node dummy = new Node(-1);dummy.next = head;Node pre = dummy;//得到翻转链表的头节点的前一个节点for(int i = 0;i < m - 1;i++){pre = pre.next;}//翻转链表的最后一个节点Node rightNode = pre;for(int i = 0; i < n - m + 1;i++){rightNode = rightNode.next;}//翻转链表的头节点Node leftNode = pre.next;pre.next = null;System.out.println(rightNode.val);Node curNext = rightNode.next;rightNode.next = null;reverse(leftNode);pre.next = rightNode;leftNode.next = curNext;return dummy.next;
}

3. 链表中的节点每k个一组翻转

在这里插入图片描述

❤️❤️ 算法思路: 因为要翻转链表,那么我们可以联想到使用栈,栈是先进后出的,那么此时我们把节点添加到栈中,等到栈中添了k个节点之后,然后我们把这些节点依次从栈中取出来并且连接每个节点,那么这就反转了一组链表片段。如果在遍历链表的时候,如果这一组不够k个,那么我们就直接把剩下的几个节点添加到反转链表的末尾即可
在这里插入图片描述

public Node kCountsReverse(Node head,int k){if(head == null || head.next == null) {return head;}//使用栈,把链表中的节点压到栈中,进栈的时候,一边计数,如果此时的这个计数的结果等于k 那么就退出,把栈中的节点弹出来//并且连接在一起。如果不够k个一组,那么就直接拼到翻转链表的后面Stack<Node> stack = new Stack<>();Node dummy = new Node(-1);Node p = dummy;  //添加后续节点while(true){int count = 0;Node cur = head;while(cur != null && count != k){stack.push(cur);count++;cur = cur.next;}//如果不构成一组,但是此时cur == nullif(count != k){//直接拼接p.next = head;break;}while(!stack.empty()){p.next = stack.pop();p = p.next;}p.next = cur;head = cur;}return dummy.next;
}

4. 合并两个排序的链表

在这里插入图片描述

❤️❤️ 算法思路: 首先判定先决条件如果在待排序的链表中,有一个链表为空,那么就直接返回另一个链表,如果两个链表都为空,那么就直接输出null。如果两个链表都不为空,那么就进行排序,设置一个虚拟节点dummy,然后设置一个连接链表的指针p,这个指针p用来遍历整个链表,起先这个指针p指向节点dummy.
在这里插入图片描述

public Node sort(Node head1,Node head2){if(head1 == null && head2 == null){return null;}if(head1 == null){return head2;}if(head2 == null){return head1;}Node dummy = new Node(-1);Node p = dummy;Node cur1 = head1;Node cur2 = head2;while(cur1 != null && cur2 != null){if(cur1.val <= cur2.val){p.next = cur1;cur1 = cur1.next;}else{p.next = cur2;cur2 = cur2.next;}p = p.next;}if(cur1 != null){p.next = cur1;}if(cur2 != null){p.next = cur2;}return dummy.next;
}

5. 合并k个排序的链表

两种方法,方法一使用归并排序,方法二:使用堆
在这里插入图片描述

❤️❤️算法思路方法一:使用归并排序思想,根据归并排序思想,我们把这k个链表一直分,一直分,分到 这个组合有两个链表,我们两个链表进行合并,然后再返回排序好的链表。总的来说就是先分后合。这里我们可以把每个链表看成一个元素,就是list之间进行分治然后在合并
在这里插入图片描述

public Node func(List<Node> list){if(list == null){return null;}return process(list,0,list.size() - 1);
}
public Node process(List<Node> list,int left,int right){if(left > right){return null;}else if(left == right){return list.get(left);}int mid = (left + right) >> 1; Node head1 = process(list,left,mid);Node head2 = process(list,mid + 1,right);//调用上面我们写的排序两个已经排序好的链表中的那个题目的代码return sort(head1,head2);
}

❤️❤️**算法思路方法二:**使用优先队列。其实我们在题目中可以不进行指定创建出来的queue对象是小顶堆,其实创建出来的queue对象默认就是一个小顶堆。就是把这k个链表的头节点,都加到小顶堆中,让每个链表的头节点进行比较,在小顶堆中,值域较小的节点就在堆顶,然后我们创建出一个虚拟节点,用于来连接排序好的链表,还有设置指针p.如果小顶堆不为空,那么就的弹出小顶堆的堆顶元素,并且保存堆顶元素,使用指针p 连接弹出的这个节点,然后判断弹出的这个节点有没有后继节点,如果有就添加到小顶堆中。继续使用小顶堆,找出最小的节点,使用p指针,继续拼接
在这里插入图片描述

public Node func2(List<Node> list){if(list == null){return null;}PriorityQueue<Node> queue = new PriorityQueue<>((v1,v2)->(v1.val - v2.val));//把每个链表的头节点都加到小跟堆中for(int i = 0;i < list.size();i++){//如果k个链表中的头节点,不为空,那么就把这个节点添加到小跟堆中if(list.get(i) != null){queue.offer(list.get(i));}}Node dummy = new Node(-1);Node p = dummy;while(!queue.isEmpty()){//如果此时的小跟堆不为空,那么此时就弹出堆中最小的元素,也就是堆顶元素Node node = queue.poll();p.next = node;p = p.next;//如果堆顶元素在链表中还有下一个节点,那么就把下一个节点添加到小顶堆中,继续下一次比较if(node.next != null){queue.offer(node.next);}}return dummy.next;
}

6. 判断链表是否有环

在这里插入图片描述

❤️❤️算法思路: 其实这是一个非常经典的面试题,这个题目考察的是快慢指针,起初让快慢指针同时位于链表的头节点,然后遍历链表,让慢指针一次遍历一个节点,让快指针一次遍历两个节点(跳跃两个节点),如果是环形链表,那么此时的快指针和慢指针一定会在某一个位置相遇

public boolean isCycle(Node head){if(head == null){return false;}if(head.next == null) {return true;}Node slow = head;Node fast = head;while(fast.next != null && fast.next.next != null){slow = slow.next;fast = fast.next.next;if(slow == fast){return true; }}return false;
}

7. 链表中倒数第k个节点

在这里插入图片描述

❤️❤️算法思想: 设置两个指针,一个是快指针,一个是慢指针,先让快指针遍历k步,那么此时的慢指针和快指针之间就相差k个节点,那么此时让慢指针和快指针一块遍历链表,一次遍历一个节点,直到快指针指向的节点为null,那么此时的慢指针就指向了链表的倒数第k个节点

ublic Node func2(Node head,int k){//设置一个指针,先让这个快指针走k步,然后设置一个慢指针,快指针和慢指针一块走,知道快指针遍历到了null节点,//那么此时就找到了链表的倒数第k个节点Node slow = head;Node fast = head;int count = 0;while(count != k){if(fast != null){count++;fast = fast.next;}else{return null;}}while(fast != null){slow = slow.next;fast = fast.next;}return slow;
}

8. 删除链表中的倒数第k和节点

在这里插入图片描述

❤️❤️算法思路: 首先我们要设置一个虚拟节点,然后让这个虚拟节点的next指针指向头结点,因为在题目中有可能删除头结点。然后我们和上题是一样的设置两个指针,一个快指针,一个慢指针,快指针先遍历k步,因为我们最终要找到的是删除节点的前一个节点,然后让这前一个节点的next指针指向删除节点的后一个节点。所以此时我们的循环条件就由原来的fast != null 变成了 fast.next != null 这样快指针和慢指针一次走一步,然后直到fast.next == null 那么我们此时就找到了链表的倒数第k + 1 个节点,就是删除节点的前一个节点,然后它的next指针指向删除节点的后一个节点。
在这里插入图片描述

public Node func3(Node head,int k){if(head == null){return null;}Node dummy = new Node(-1);dummy.next = head;Node slow = dummy;Node fast = dummy;for(int i = 0;i < k;i++){fast = fast.next;}while(fast.next != null){slow = slow.next;fast = fast.next;}slow.next = slow.next.next;return dummy.next;
}

9. 两个链表的第一个公共节点

在这里插入图片描述

❤️❤️ 算法思路: 首先得到两个链表的长度,让长的链表减去短的链表的长度,得到的差值,让长链表走差值步,然后两个链表中的指着一步一个走,知道两个链表的节点重合

public Node func4(Node head1,Node head2){if(head1 == null || head2 == null){return null;}int count1 = getCount(head1);int count2 = getCount(head2);int num = Math.abs(count1 - count2);if(count1 > count2){while(num != 0){head1 = head1.next;num--;}}else{while(num != 0){head2 = head2.next;num--;}}while(head1 != head2){head1 = head1.next;head2 = head2.next;}return head1;
}

10.链表的入环节点

在这里插入图片描述

在这里插入图片描述

❤️❤️算法思想: 首先判断链表是否有环,如果链表是无环的,那么就不存在这个链表的入环节点,然后就是当快指针和慢指针走到一块的时候,此时就记住这个节点,然后让慢指针指向链表的头部,然后两个指针一块走,直到两个指针相遇。

public Node getCycle(Node head){Node slow = head;Node fast = head;while(fast.next != null && fast.next.next != null){slow = slow.next;fast = fast.next.next;if(slow == fast){return slow;}}return null;
}
public Node cycleNode(Node head){if(head == null || head.next == null){return null;}Node fast = getCycle(head);if(fast == null){return null;}Node slow = head;while(slow != fast){slow = slow.next;fast = fast.next;}return slow;
}

11. 链表相加(二)

在这里插入图片描述

❤️❤️算法思想: 其实就相当于是两个数字在相加,数字在相加的时候,是从个位开始相加的,那么我们此时只有把链表翻转之后,才能相加,并且在相加的时候要注意进位,相加完之后,得到翻转的结果之后,把链表进行翻转

public Node getSum(Node head1,Node head2){if(head1 == null && head2 == null){return null;}if(head1 == null){return head2;}if(head2 == null){return head1;}int carry = 0;//翻转链表Node newHead1 = reverse(head1);Node newHead2 = reverse(head2);Node dummy = new Node(-1);Node p = dummy;while(newHead1 != null || newHead2 != null){int sum = (newHead1 == null ? 0 : newHead1 .val) + (newHead2 == null ? 0 : newHead2.val) + carry;carry = sum >= 10 ? sum / 10 : 0;sum = sum >= 10 ? sum % 10 : sum;Node node = new Node(sum);p.next = node;p = p.next;newHead1 = newHead1 == null ? null : newHead1.next;newHead2 = newHead2 == null ? null : newHead2.next;}if(carry != 0){p.next = new Node(carry);}return reverse(dummy.next);
}

12. 单链表排序

在这里插入图片描述

❤️❤️算法思想: 其实这个题还是很简单的,我们可以改成归并排序,其实这个归并排序思想就是把链表从中间分开,每次都进行分,知道把链表分成单个的节点,然后在里用两个有序链表构成一个新的有序的大链表就行了。这个就是典型的归并排序。

public class Solution {/*** * @param head ListNode类 the head node* @return ListNode类*/public ListNode sortInList (ListNode head) {//保证时间复杂度为O(n * logn)if(head == null || head.next == null){return head;}//每次都断开中间节点ListNode temp = getMid(head);ListNode head1 = sortInList(head);ListNode head2 = sortInList(temp);return marge(head1,head2);}private ListNode marge(ListNode head1, ListNode head2) {ListNode dummy = new ListNode(-1);ListNode p = dummy;while(head1 != null && head2 != null){if(head1.val <= head2.val){p.next = head1;head1 = head1.next;} else{p.next = head2;head2 = head2.next;}p = p.next;}if(head1 != null){p.next = head1;}if(head2 != null){p.next = head2;}return dummy.next;}private ListNode getMid(ListNode head) {ListNode slow = head;ListNode fast = head;while(fast.next != null && fast.next.next != null){slow = slow.next;fast = fast.next.next;}ListNode temp = slow.next;slow.next = null;return temp;}
}

13.判断一个链表是否是回文结构

在这里插入图片描述

❤️❤️算法思想:找到链表的中间节点,把中间节点之后的链表节点全部翻转,然后让一个指针指向链表的头节点,让一个指针指向翻转链表的头节点,然后两个指针一个向右遍历,一个向左遍历,在遍历的过程中判断,节点中的val值是否是相同的。

public class Solution {/**** @param head ListNode类 the head* @return bool布尔型*/private ListNode getMid(ListNode head) {ListNode slow = head;ListNode fast = head;while(fast.next != null && fast.next.next != null){slow = slow.next;fast = fast.next.next;}return slow;}//方法二翻转部分链表public boolean isPail (ListNode head) {if(head == null){return false;}//找到链表的中间节点ListNode preNewHead = getMid(head);ListNode newHead = preNewHead.next;preNewHead.next = null;ListNode cur = reverse(newHead);while(head != null && cur != null){if(head.val != cur.val){return false;}head = head.next;cur = cur.next;}return true;}private ListNode reverse(ListNode head) {ListNode pre = null;ListNode cur = head;while(cur != null){ListNode curNext = cur.next;cur.next = pre;pre = cur;cur = curNext;}return pre;}
}

14. 链表的奇偶重排

在这里插入图片描述

❤️❤️算法思想: 首先呢,这是一种笨办法,我们把原链表中所有的全部节点添加到栈中,并且把每个节点之前的连接断开,在栈中添加节点的时候我们还要进行奇数,要知道在栈中得到了多少个节点,然后设置两个虚拟节点和两个遍历指针p1,p2,然后我们把栈中的节点弹出来根据此时的count判断此时这个是偶数位节点和时奇数位节点,然后拼好两个链表,然后把两个链表进行翻转,然后两个链表拼接。

public static Node func2(Node head){Stack<Node> stack = new Stack<>();Node dummy1 = new Node(-1);Node p1 = dummy1;Node dummy2 = new Node(-2);Node p2 = dummy2;Node cur = head;int count = 0;while(cur != null){Node curNext = cur.next;cur.next = null;stack.push(cur);count++;cur = curNext;}while(count != 0){//奇数if(count % 2 == 1){p1.next = stack.pop();p1 = p1.next;}else{//偶数p2.next = stack.pop();p2 = p2.next;}count--;}//因为此时的两个链表是有栈得到的,那么此时它们的排列顺序是不对的,那么此时我们把这两个链表进行翻转Node node1 = reverse(dummy1.next);Node node2 = reverse(dummy2.next);Node ret = node1;while(node1.next != null){node1 = node1.next;}//得到奇数链表的最后一个节点,和偶数链表的最后一个节点相连node1.next = node2;return ret;
}

15.删除有序链表中重复的元素I

在这里插入图片描述

❤️❤️算法思想:先判断该链表是不是一个空链表,如果是空链表,那么就直接返回null,如果该链表只有一个节点,那么就直接返回head。因为要删除相同的节点,并且保留重复节点中的一个节点,那现在就比如说,此时有 cur,cur.next这个两个指针指向的节点,这两个节点的值域中的val是一样的,那么此时我们就保留cur这个位置上的节点,删除cur.next这个指针指向的节点。判断当前节点和当前节点的下一个节点相同,那么此时我们就不在返回的链表上添加这个节点。

图示:
在这里插入图片描述

import java.util.*;
public class Solution {public ListNode deleteDuplicates (ListNode head) {//如果此时的头节点为空,或者是此时只有一个节点if(head == null || head.next == null){return head;}//设置虚拟节点,因为在删除元素的时候,可能会对于头节点有影响ListNode dummy = new ListNode(-1);ListNode p = dummy;ListNode cur = head;while(cur != null){//如果在遍历的时候遇到了相同的节点,那么此时就一直遍历,不在返回链表中插入新的节点if(cur.next != null && cur.val == cur.next.val){while(cur.next != null && cur.val == cur.next.val){cur = cur.next;}}p.next = cur;cur = cur.next;p = p.next;}//dummy.next表示的是返回链表的头节点return dummy.next;}
}

16.删除有序链表中重复的元素||

在这里插入图片描述

❤️❤️算法思想:其实这道题是上一道题的一个延伸,就是把链表中重复的的节点都删除了。那么此时我们就把预先设置的虚拟节点,看做为要返回链表的头节点,令工作节点cur = dummy 判断cur.next 和 cur.next.next是不是相同的节点,然后记录一下这两个节点的值,在判断cur.next.next之后有没有相同的节点,如果有cur.next = cur.next.next.

图示:
在这里插入图片描述

import java.util.*;
public class Solution {public ListNode deleteDuplicates (ListNode head) {if(head == null || head.next == null){return head;}ListNode dummy = new ListNode(-1);ListNode cur = dummy;dummy.next = head;while(cur.next != null && cur.next.next != null){if(cur.next.val == cur.next.next.val){int x = cur.next.val;while(cur.next != null && cur.next.val == x){cur.next = cur.next.next;}}else{cur = cur.next;}}return dummy.next;}
}

相关文章:

[牛客Hot101]链表篇

文章目录1.翻转链表2.链表内指定区间翻转3. 链表中的节点每k个一组翻转4. 合并两个排序的链表5. 合并k个排序的链表6. 判断链表是否有环7. 链表中倒数第k个节点8. 删除链表中的倒数第k和节点9. 两个链表的第一个公共节点10.链表的入环节点11. 链表相加&#xff08;二&#xff0…...

Vue3 核心模块源码解析(上)

Vue3相比大家也都有所了解&#xff0c;即使暂时没有使用上&#xff0c;但肯定也学习过&#xff01;Vue3是使用TS进行重写&#xff0c;采用了MonoRepo的管理方式进行管理&#xff0c;本篇文章我们一起来看看 Vue3的使用&#xff0c;与Vue2有什么区别&#xff0c;以及我们该如何优…...

【C进阶】指针的高级话题

文章目录:star:1. 字符指针:star:2. 指针数组2.1 指针数组的定义2.2 指针数组的使用:star:3. 数组指针3.1 数组的地址3.2 数组指针的使用:star:4. 数组参数和指针参数:star:5. 函数指针5.1 函数名和函数的地址5.2 练习:star:6. 函数指针数组6.1 转移表:star:7. 指向函数指针数组…...

无源晶振匹配电容—计算方法

以前有写过一篇文章“晶振”简单介绍了晶振的一些简单参数&#xff0c;今天我们来说下无源晶振的匹配电容计算方法&#xff1a; 如上图&#xff0c;是常见的的无源晶振常见接法&#xff0c;而今天来说到就是这种常见电路的电容计算方法&#xff0c;有两种&#xff1a; A&#…...

【测试】自动化测试03(JUnit)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录JUnit一&#xff09; 注解1. Test2. BeforeEach3. BeforeAll4. AfterEach5. AfterAll二&#xff09; 断言&#xff08;Assertions类&#xff09;三&#xff09;用例的执行顺序四&#xff09;参数化五&#xff09;测试…...

《计算机视觉和图像处理简介 - 中英双语版》:神经网络中的激活函数 ReLU vs Sigmoid

文章大纲 Neural Network Module and Training Function创建数据集Define Neural Network, Criterion function, Optimizer and Train the ModelTest Sigmoid and ReluAnalyze Results参考文献与学习路径在本文中,我们使用含有两个隐藏层的神经网络基于MNIST数据集测试Sigmoid…...

(三十七)大白话SQL标准中对事务的4个隔离级别,都是如何规定的呢?

之前我们给大家讲了数据库中多个事务并发时可能产生的几种问题&#xff0c;包括了脏写、脏读、不可重复读、幻读&#xff0c;几种问题 那么针对这些多事务并发的问题&#xff0c;实际上SQL标准中就规定了事务的几种隔离级别&#xff0c;用来解决这些问题。 注意一下&#xff…...

全国计算机等级考试三级网络技术考试大纲(2022年版)

全国计算机等级考试三级网络技术考试大纲&#xff08;2022年版&#xff09;基本要求 &#xff11;&#xff0e; 了解大型网络系统规划、管理方法&#xff1b; &#xff12;&#xff0e; 具备中小型网络系统规划、设计的基本能力&#xff1b; &#xff13;&#xff0e; 掌握中小…...

服务器部署—若依【vue】如何部署到nginx里面?nginx刷新页面404怎么办?【完美解决建议收藏】

服务器部署项目我们大家都会遇到&#xff0c;但是有些铁子会遇到很多的问题&#xff0c;比如前端部署nginx如何操作&#xff1f; 前端有单纯的静态页面、还有前后端分离的项目&#xff1b;这里博主直接分享最牛最到位的前后端分离项目的前端部署到nginx上面&#xff0c;以若依项…...

算法练习(特辑)算法常用的数据结构、集合和方法总结

一、栈stack 1、初始化&#xff1a;Stack<Integer> st new Stack<Integer>(); 2、常用方法&#xff1a; boolean empty() &#xff1a;测试堆栈是否为空。Object peek( )&#xff1a;查看堆栈顶部的对象&#xff0c;但不从堆栈中移除它。Object pop( )&#xff…...

Apk转Aab(Android-App-Bundle)

这篇文章是参考Apk转Aab(Android-App-Bundle)_YoungBillsohu的博客-CSDN博客 基本照着这个大佬的步骤来就行&#xff0c;但是要注意的是apkTool最好是下新的&#xff0c;否则&#xff0c;会出现说一堆无语的错误&#xff0c;然后导致AAPT2关联资源的时候报错 类似这样的&#…...

大学物理期末大题专题训练总结-热学大题

今天下午去找郑老师权老师等去答疑&#xff0c;老师说大题会考查得比较套路&#xff0c;计算不难。明天就要考试了&#xff0c;再把大题常见题型总结一下&#xff0c;热学这块我做完了蓝本的热学题目&#xff0c;发现了如下三种&#xff1a;有关循环过程曲线的&#xff1a;给出…...

有趣的Hack-A-Sat黑掉卫星挑战赛——卫星平台内存dump

国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加&#xff0c;太空已经成为国家赖以生存与发展的命脉之一&#xff0c;凝聚着巨大的国家利益&#xff0c;太空安全的重要性日益凸显[1]。而在信息化时代&#xff0c;太空安…...

OAK相机如何将yoloV8模型转换成blob格式?

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手…...

Python解题 - CSDN周赛第32期 - 运输石油(三维背包)

上期周赛因为最后一题出现bug&#xff0c;再加上都是经典的模板题&#xff0c;问哥就懒得写题解了。 本期也是有两道考过的题目&#xff0c;不过最后一题因为考到了背包问题的特殊类型&#xff0c;还是值得拿出来记个笔记。 第一题&#xff1a;传奇霸业 传奇霸业&#xff0c;是…...

JVM - G1垃圾收集器深入剖析

​​​​​​​1、G1收集器概述 HotSpot团队一直努力朝着高效收集、减少停顿(STW: Stop The World)的方向努力&#xff0c;也贡献了从串行Serial收集器、到并行收集器Parallerl收集器&#xff0c;再到CMS并发收集器&#xff0c;乃至如今的G1在内的一系列优秀的垃圾收集器。 G…...

角度制与弧度制的相互转换np.deg2radnp.rad2deg

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】角度制与弧度制的相互转换np.deg2radnp.rad2deg选择题以下关于python代码表述错误的一项是?import numpy as npprint("【执行】np.rad2deg(np.pi)")print(np.rad2deg(np.pi))print(&…...

【SAP Abap】X-DOC:SAP ABAP 语法更新之一(Open SQL新增特性)

SAP ABAP 语法更新之一&#xff08;Open SQL新增特性&#xff09;1、前言2、演示1、前言 自从 SAP 推出 SAP ON HANA&#xff0c;与之相随的 AS ABAP NW 7.40 版本以后&#xff0c;ABAP 语法也有了较多的更新&#xff0c;本篇对 Open Sql的语法更新部分做一个DEMO演示。 NW 7…...

【改进灰狼优化算法】改进收敛因子和比例权重的灰狼优化算法【期刊论文完美复现】(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…...

Linux C代码获取线程ID

Linux C代码获取线程ID gettid可以获取线程id,但是通过man gettid可以看到下面这两句 也就是说glibc没有为这个gettid封装系统调用&#xff0c;需要使用syscall。 #define _GNU_SOURCE#include <unistd.h>#include <sys/syscall.h>#include <sys/types.h>pi…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...