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

数据结构与算法-链表

单向链表(带哨兵)

public class SinglyLinkedList {private Node head = new Node(Integer.MIN_VALUE, null); // 定义一个哨兵节点作为头部节点,避免对头节点进行特殊处理// 节点类,包含值和指向下一个节点的引用private static class Node { int value; // 存储节点的值Node next; // 指向下一个节点的引用public Node(int value, Node next) {this.value = value;this.next = next;}}// 查找指定索引处的节点,使用-1作为起始索引来兼容哨兵节点private Node findNode(int index) {int i = -1; // 从-1开始以适应哨兵节点for(Node curr = this.head; curr != null; curr = curr.next, i++) {if(i == index) {return curr;}}return null; // 如果索引超出范围,则返回null}// 查找最后一个节点private Node findLast() {Node curr;for(curr = this.head; curr.next != null;) { // 遍历直到找到最后一个节点curr = curr.next;}return curr; // 返回最后一个节点}// 在链表末尾添加新节点public void addLast(int value) {Node last = findLast();last.next = new Node(value, null);}// 在指定索引位置插入新节点public void insert(int index, int value) {Node prev = findNode(index - 1); // 找到前一个节点if(prev != null) {prev.next = new Node(value, prev.next); // 插入新节点} else {throw illegalIndex(index); // 如果索引不合法则抛出异常}}// 删除指定索引位置的节点public void remove(int index) {Node prev = findNode(index - 1); // 找到要删除节点的前一个节点Node curr;if(prev != null && (curr = prev.next) != null) { // 确保prev和curr都不为nullprev.next = curr.next; // 删除当前节点} else {throw illegalIndex(index); // 如果索引不合法则抛出异常}}// 在链表头部添加新节点public void addFirst(int value) {this.head.next = new Node(value, this.head.next);}// 创建一个非法索引异常private IllegalArgumentException illegalIndex(int index) {return new IllegalArgumentException(String.format("index [%d] 不合法%n", index));}
}

双向链表(带哨兵)

public class DoublyLinkedListSentinel {// 节点类,包含指向前一个和后一个节点的引用以及存储的值static class Node {Node prev; // 指向前一个节点int value; // 存储节点的值Node next; // 指向下一个节点public Node(Node prev, int value, Node next) {this.prev = prev;this.value = value;this.next = next;}}private final Node head; // 哨兵头节点private final Node tail; // 哨兵尾节点// 构造函数,初始化哨兵头节点和尾节点,并将它们连接起来public DoublyLinkedListSentinel() {head = new Node(null, 666, null); // 头部哨兵节点,值为666tail = new Node(null, 888, null); // 尾部哨兵节点,值为888head.next = tail;tail.prev = head;}// 查找指定索引处的节点,从头节点开始查找private Node findNode(int index) {int i = -1; // 从-1开始以适应哨兵节点for (Node p = head; p != tail; p = p.next, i++) {if (i == index) {return p;}}return null; // 如果索引超出范围,则返回null}// 在链表头部添加新节点public void addFirst(int value) {insert(0, value);}// 删除链表中的第一个节点public void removeFirst() {remove(0);}// 在链表末尾添加新节点public void addLast(int value) {Node pre = tail.prev; // 获取当前最后一个实际节点Node added = new Node(pre, value, tail); // 创建新节点并插入到末尾pre.next = added;tail.prev = added;}// 删除链表中的最后一个节点public void removeLast() {Node removed = tail.prev; // 获取当前最后一个实际节点if (removed == head) { // 如果没有实际节点(只有哨兵)throw illegalIndex(0);}Node prev = removed.prev; // 获取前一个节点prev.next = tail; // 更新前一个节点的next指向尾哨兵tail.prev = prev; // 更新尾哨兵的prev指向新的最后一个实际节点}// 在指定索引位置插入新节点public void insert(int index, int value) {Node prev = findNode(index - 1); // 找到要插入位置的前一个节点if (prev == null || prev.next == tail) { // 确保前一个节点存在且不是尾哨兵throw illegalIndex(index);}Node next = prev.next; // 获取前一个节点的下一个节点Node inserted = new Node(prev, value, next); // 创建新节点并插入prev.next = inserted;next.prev = inserted;}// 删除指定索引位置的节点public void remove(int index) {Node prev = findNode(index - 1); // 找到要删除节点的前一个节点if (prev == null || prev.next == tail) { // 确保前一个节点存在且不是尾哨兵throw illegalIndex(index);}Node removed = prev.next; // 获取要删除的节点Node next = removed.next; // 获取要删除节点的下一个节点prev.next = next; // 更新前一个节点的next指向next.prev = prev; // 更新下一个节点的prev指向}// 创建一个非法索引异常private IllegalArgumentException illegalIndex(int index) {return new IllegalArgumentException(String.format("index [%d] 不合法%n", index));}
}

环形链表(带哨兵)

public class DoublyLinkedListSentinel {// 节点类,包含指向前一个和后一个节点的引用以及存储的值static class Node {Node prev;  // 指向前一个节点int value;  // 存储节点的值Node next;  // 指向下一个节点public Node(Node prev, int value, Node next) {this.prev = prev;this.value = value;this.next = next;}}private final Node sentinel; // 哨兵节点,用于简化边界条件处理// 构造函数,初始化哨兵节点,使其形成一个自循环的环public DoublyLinkedListSentinel() {sentinel = new Node(null, -1, null); // 初始化哨兵节点,值为-1sentinel.next = sentinel;           // 将哨兵节点的next指向自己sentinel.prev = sentinel;           // 将哨兵节点的prev指向自己}// 在链表头部添加新节点public void addFirst(int value) {Node next = sentinel.next;          // 获取当前第一个实际节点Node prev = sentinel;               // 哨兵节点作为前一个节点Node added = new Node(prev, value, next); // 创建新节点并插入到头部prev.next = added;                  // 更新哨兵节点的next指向新节点next.prev = added;                  // 更新第一个实际节点的prev指向新节点}// 在链表末尾添加新节点public void addLast(int value) {Node prev = sentinel.prev;          // 获取当前最后一个实际节点Node next = sentinel;               // 哨兵节点作为下一个节点Node added = new Node(prev, value, next); // 创建新节点并插入到末尾prev.next = added;                  // 更新最后一个实际节点的next指向新节点next.prev = added;                  // 更新哨兵节点的prev指向新节点}// 删除链表中的第一个节点public void removeFirst() {Node removed = sentinel.next;       // 获取第一个实际节点if (removed == sentinel) {          // 如果链表为空,抛出异常throw new IllegalArgumentException("非法操作:链表为空");}Node a = sentinel;                  // 哨兵节点作为前一个节点Node b = removed.next;              // 第二个实际节点作为下一个节点a.next = b;                         // 更新哨兵节点的next指向第二个实际节点b.prev = a;                         // 更新第二个实际节点的prev指向哨兵节点}// 删除链表中的最后一个节点public void removeLast() {Node removed = sentinel.prev;       // 获取最后一个实际节点if (removed == sentinel) {          // 如果链表为空,抛出异常throw new IllegalArgumentException("非法操作:链表为空");}Node a = removed.prev;              // 获取倒数第二个实际节点Node b = sentinel;                  // 哨兵节点作为下一个节点a.next = b;                         // 更新倒数第二个实际节点的next指向哨兵节点b.prev = a;                         // 更新哨兵节点的prev指向倒数第二个实际节点}// 根据值查找节点private Node findNodeByValue(int value) {Node p = sentinel.next;             // 从第一个实际节点开始遍历while (p != sentinel) {             // 遍历直到回到哨兵节点if (p.value == value) {         // 如果找到目标值,返回该节点return p;}p = p.next;                     // 继续遍历下一个节点}return null;                        // 如果没有找到,返回null}// 根据值删除节点public void removeByValue(int value) {Node removed = findNodeByValue(value); // 查找要删除的节点if (removed != null) {              // 如果找到了节点Node prev = removed.prev;       // 获取前一个节点Node next = removed.next;       // 获取后一个节点prev.next = next;               // 更新前一个节点的next指向后一个节点next.prev = prev;               // 更新后一个节点的prev指向前一个节点}}
}

反转单向链表-Leetcode 206

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

 方法一:

public ListNode reverseList(ListNode o1) {ListNode n1 = null;ListNode p = o1;while (p != null) {n1 = new ListNode(p.val, n1);p = p.next;}return n1;
}

方法二:

public ListNode reverseList(ListNode head) {ListNode p=head;if(p!=null || p.next!=null) {return p;}ListNode last=reverseList(p.next);p.next.next=p;p.next=null;return last;}

根据值删除节点-Leetcode 203

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例 1:

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1
输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]

 方法一:

public ListNode removeElements(ListNode head, int val) {ListNode sential=new ListNode(-1,head);ListNode p1=sential;ListNode p2;while((p2=p1.next)!=null) {if(p2.val==val) {p1.next=p2.next;}else {p1=p1.next;}}return sential.next;}

方法二:

public ListNode removeElements(ListNode head, int val) {if (head == null) {return null;}if (head.val == val) {return removeElements(head.next, val);} else {head.next = removeElements(head.next, val);return head;}
}

删除倒数节点-Leetcode 19

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

方法一:

public ListNode removeNthFromEnd(ListNode head, int n) {ListNode sentinel=new ListNode(-1,head);recursion(sentinel, n);return sentinel.next;}
public int recursion(ListNode p,int n) {if(p==null) {return 0;}int nth=recursion(p.next, n);if(nth==n) {p.next=p.next.next;}return nth+1;
}

方法二:

public ListNode removeNthFromEnd(ListNode head, int n) {ListNode s = new ListNode(-1, head);ListNode p1 = s;ListNode p2 = s;for (int i = 0; i < n + 1; i++) {p2 = p2.next;}while (p2 != null) {p1 = p1.next;p2 = p2.next;}p1.next = p1.next.next;return s.next;
}

有序链表去重-Leetcode 83

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

示例 1:

输入:head = [1,1,2]
输出:[1,2]

示例 2:

输入:head = [1,1,2,3,3]
输出:[1,2,3]

 方法一:

public ListNode deleteDuplicates(ListNode head) {if(head==null || head.next==null) {return head;}ListNode p1=head;ListNode p2;while((p2=p1.next)!=null) {if(p1.val==p2.val) {p1.next=p2.next;}else {p1=p1.next;}}return head;
}

方法二:

public ListNode deleteDuplicates(ListNode p) {if (p == null || p.next == null) {return p;}if(p.val == p.next.val) {return deleteDuplicates(p.next);} else {p.next = deleteDuplicates(p.next);return p;}
}

有序链表去重-Leetcode 82

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

示例 1:

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

示例 2:

输入:head = [1,1,1,2,3]
输出:[2,3]

 方法一:

public ListNode deleteDuplicates(ListNode p) {if (p == null || p.next == null) {return p;}if (p.val == p.next.val) {ListNode x = p.next.next;while (x != null && x.val == p.val) {x = x.next;}return deleteDuplicates(x);} else {p.next = deleteDuplicates(p.next);return p;}
}

方法二:

public ListNode deleteDuplicates(ListNode head) {if (head == null || head.next == null) {return head;}ListNode s = new ListNode(-1, head);ListNode p1 = s;ListNode p2;ListNode p3;while ((p2 = p1.next) != null && (p3 = p2.next) != null) {if (p2.val == p3.val) {while ((p3 = p3.next) != null && p3.val == p2.val) {}p1.next = p3;} else {p1 = p1.next;}}return s.next;
}

合并有序链表-Leetcode 21

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

 方法一:

public ListNode mergeTwoLists(ListNode p1, ListNode p2) {ListNode s = new ListNode(-1, null);ListNode p = s;while (p1 != null && p2 != null) {if (p1.val < p2.val) {p.next = p1;p1 = p1.next;} else {p.next = p2;p2 = p2.next;}p = p.next;}if (p1 != null) {p.next = p1;}if (p2 != null) {p.next = p2;}return s.next;
}

方法二:

public ListNode mergeTwoLists(ListNode p1,ListNode p2){if (p2==null){return p1;}if(p1==null){return p2;}if (p1.val<p2.val){p1.next=mergeTwoLists(p1.next,p2);return p1;}else{p2.next=mergeTwoLists(p1,p2.next);return p2;}
}

合并多个有序链表-Leetcode 23

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[1->4->5,1->3->4,2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:

输入:lists = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

public ListNode mergeKLists(ListNode[] lists) {if (lists.length == 0) {return null;}return split(lists, 0, lists.length - 1);
}public ListNode split(ListNode[] lists, int i, int j) {System.out.println(i + " " + j);if (j == i) {return lists[i];}int m = (i + j) >>> 1;return mergeTwoLists(split(lists, i, m),split(lists, m + 1, j));
}
public ListNode mergeTwoLists(ListNode p1,ListNode p2){if (p2==null){return p1;}if(p1==null){return p2;}if (p1.val<p2.val){p1.next=mergeTwoLists(p1.next,p2);return p1;}else{p2.next=mergeTwoLists(p1,p2.next);return p2;}
}

查找链表中间节点-Leetcode 876

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。

示例 2:

输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。
public ListNode middleNode(ListNode head) {ListNode p1 = head;	// 慢指针,中间点ListNode p2 = head;	// 快指针while (p2 != null && p2.next != null) {p1 = p1.next;p2 = p2.next;p2 = p2.next;}return p1;
}

回文链表-Leetcode 234

给你一个单链表的头节点 head ,请你判断该链表是否为

回文链表

。如果是,返回  true ;否则,返回  false 。

示例 1:

输入:head = [1,2,2,1]
输出:true

示例 2:

输入:head = [1,2]
输出:false
public boolean isPalindrome(ListNode head) {if(head==null || head.next==null) {return true;}ListNode p1=head;ListNode p2=head;ListNode o1=p1;ListNode n1=null;while(p2!=null && p2.next!=null) {p1=p1.next;p2=p2.next;p2=p2.next;o1.next=n1;n1=o1;p1=o1;}if(p2!=null) {p1=p1.next;}while(n1!=null) {if(n1.val!=p1.val) {return false;}p1=p1.next;n1=n1.next;}return true;
}

环形链表-Leetcode 141

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

public boolean hasCycle(ListNode head) {ListNode h = head; // 兔ListNode t = head; // 龟while (h != null && h.next != null) {t = t.next;h = h.next.next;if(h == t){return true;}}return false;
}

环形链表-Leetcode 142

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

    示例 1:

    输入:head = [3,2,0,-4], pos = 1
    输出:返回索引为 1 的链表节点
    解释:链表中有一个环,其尾部连接到第二个节点。
    

    示例 2:

    输入:head = [1,2], pos = 0
    输出:返回索引为 0 的链表节点
    解释:链表中有一个环,其尾部连接到第一个节点。
    

    示例 3:

    输入:head = [1], pos = -1
    输出:返回 null
    解释:链表中没有环。
    

    提示:

    • 链表中节点的数目范围在范围 [0, 104] 内
    • -105 <= Node.val <= 105
    • pos 的值为 -1 或者链表中的一个有效索引

    public ListNode detectCycle(ListNode head) {ListNode t=head;ListNode h=head;while(h!=null && h.next!=null) {t=t.next;h=h.next.next;if(t==h) {t=head;while(true) {if(h==t) {return h;}h=h.next;t=t.next;}}}return null;
    }

    相关文章:

    数据结构与算法-链表

    单向链表&#xff08;带哨兵&#xff09; public class SinglyLinkedList {private Node head new Node(Integer.MIN_VALUE, null); // 定义一个哨兵节点作为头部节点&#xff0c;避免对头节点进行特殊处理// 节点类&#xff0c;包含值和指向下一个节点的引用private static …...

    【图片合并转换PDF】如何将每个文件夹下的图片转化成PDF并合并成一个文件?下面基于C++的方式教你实现

    医院在为患者进行诊断和治疗过程中&#xff0c;会产生大量的医学影像图片&#xff0c;如 X 光片、CT 扫描图、MRI 图像等。这些图片通常会按照检查时间或者检查项目存放在不同的文件夹中。为了方便医生查阅和患者病历的长期保存&#xff0c;需要将每个患者文件夹下的图片合并成…...

    协议-ACLLite-ffmpeg

    是什么&#xff1f; FFmpeg是一个开源的多媒体处理工具包&#xff0c;它集成了多种功能&#xff0c;包括音视频的录制、转换和流式传输处理。FFmpeg由一系列的库和工具组成&#xff0c;其中最核心的是libavcodec和libavformat库。 libavcodec是一个领先的音频/视频编解码器库&…...

    flask开发的网站,后端服务关闭后,可以找回之前的数据的吗

    如果使用 Flask 开发的网页&#xff0c;后端服务关闭后&#xff0c;是否还能找回数据取决于数据的存储方式&#xff1a; 可能找回数据的情况&#xff1a; 数据库存储&#xff08;MySQL、PostgreSQL、SQLite 等&#xff09; 如果 Flask 连接的是持久化数据库&#xff0c;即使后…...

    deepseek API开发简介

    1、申请deepseek api key&#xff1a; https://platform.deepseek.com/api_keys创建API Key&#xff0c;并复制Key 2、安装python、pip&#xff0c;然后安装requests pip install requests3、.示例代码 import requests import json# DeepSeek API 地址 API_URL "ht…...

    【AI】在Ubuntu中使用docker对DeepSeek的部署与使用

    这篇文章前言是我基于部署好的deepseek-r1:8b模型跑出来的 关于部署DeepSeek的前言与介绍 在当今快速发展的技术环境中&#xff0c;有效地利用机器学习工具来解决问题变得越来越重要。今天&#xff0c;我将引入一个名为DeepSeek 的工具&#xff0c;它作为一种强大的搜索引擎&a…...

    Baklib推进内容中台智能推荐系统的技术创新与执行方案

    内容概要 在当前数字化快速发展的背景下&#xff0c;内容中台的智能化推荐系统显得尤为重要。通过技术创新&#xff0c;Baklib致力于提升平台的用户体验&#xff0c;实现精准的个性化推荐&#xff0c;满足多样化的用户需求。内容中台不仅能够高效管理和组织大量的信息与知识&a…...

    MySQL8.0实现MHA高可用

    一、简介 MHA&#xff08;Master HA&#xff09;是一款开源的 MySQL 的高可用程序&#xff0c;它为 MySQL 主从复制架构提供了 automating master failover 功能。MHA 在监控到 master 节点故障时&#xff0c;会提升其中拥有最新数据的 slave 节点成为新的master 节点&#xf…...

    ip地址是手机号地址还是手机地址

    在数字化生活的浪潮中&#xff0c;IP地址、手机号和手机地址这三个概念如影随形&#xff0c;它们各自承载着网络世界的独特功能&#xff0c;却又因名称和功能的相似性而时常被混淆。尤其是“IP地址”这一术语&#xff0c;经常被错误地与手机号地址或手机地址划上等号。本文旨在…...

    多光谱成像技术在华为Mate70系列的应用

    华为Mate70系列搭载了光谱技术的产物——红枫原色摄像头&#xff0c;这是一款150万像素的多光谱摄像头。 相较于普通摄像头&#xff0c;它具有以下优势&#xff1a; 色彩还原度高&#xff1a;色彩还原准确度提升约 120%&#xff0c;能捕捉更多光谱信息&#xff0c;使拍摄照片色…...

    21.2.6 字体和边框

    版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 通过设置Rang.Font对象的几个成员就可以修改字体&#xff0c;设置Range.Borders就可以修改边框样式。 【例 21.6】【项目&#xff…...

    详解命令模式

    引言 当遇到发送者和接受者之间不是直接连接关系&#xff0c;而是间接连接关系&#xff0c;即发送者和接受者之间需要解耦&#xff0c;我们通常需要命令模式。比如电灯和开关&#xff0c;开关设计时并不知道自己是控制电灯的&#xff0c;也可能控制排气扇、电力设备等等&#x…...

    Debian 安装 Nextcloud 使用 MariaDB 数据库 + Caddy + PHP-FPM

    前言 之前通过 docker在ubuntu上安装Nextcloud&#xff0c;但是现在我使用PVE安装Debian虚拟机&#xff0c;不想通过docker安装了。下面开始折腾。 安装过程 步骤 1&#xff1a;更新系统并安装必要的软件 sudo apt update && sudo apt upgrade -y sudo apt install…...

    string 与 wstring 的字符编码

    测试代码: #include<stdio.h> #include<stdlib.h> #include<windows.h> #include <locale.h> #include <string> #include <iostream>// 函数用于计算UTF-8字符串中的字符数 int utf8_strlen(const char* str) {int len = 0;for (; *s…...

    golang 开启HTTP代理认证

    内部网路不能直接访问外网接口&#xff0c;可以通过代理发送HTTP请求。 HTTP代理服务需要进行认证。 package cmdimport ("fmt""io/ioutil""log""net/http""net/url""strings" )// 推送CBC07功能 func main() {l…...

    第九届华为ICT大赛实践赛中国总决赛举行通知及考试地址

    经大赛组委会决定&#xff0c;第九届华为ICT大赛实践赛中国总决赛将于2025年3月8日-9日举行具体赛事安排如下&#xff0c;期待与您顶峰相见! 理论考试:线上答题&#xff0c;团队3名成员共同完成1套试题&#xff0c;统一提交一份答案【60分钟&#xff0c;20道试题(含判断、单选…...

    FFmpeg 与 FFplay 参数详解:-f、-pix_fmt、-pixel_format 和 -video_size 的区别与用法

    FFmpeg 与 FFplay 参数详解:-f、-pix_fmt、-pixel_format 和 -video_size 的区别与用法 在使用 FFmpeg 和 FFplay 进行视频处理和播放时,-f、-pix_fmt、-pixel_format 和 -video_size 是常用的参数。这些参数的作用和使用场景略有不同,理解它们的区别和用法对于正确处理和播…...

    深入理解 C++17 std::is_swappable

    文章目录 深入理解 C17 std::is_swappable引言std::is_swappable 概述std::is_swappable 的工作原理std::is_swappable 的变体注意事项结论 深入理解 C17 std::is_swappable 引言 在 C 编程中&#xff0c;交换两个对象的值是一个常见的操作。为了确保代码的通用性和安全性&am…...

    直接插入排序

    一&#xff1a;直接插入排序是什么。 二&#xff1a;如何实现直接插入排序 三&#xff1a;直接插入排序时间复杂度 一&#xff1a;直接插入排序它是排序得一种&#xff0c;其目的无非是将乱序通过排序排成有序的。 我们可以通过动画直观看什么是直接插入排序 这是我找的直接…...

    基于可信数据空间的企业数据要素与流通体系建设(附ppt 下载)

    近期&#xff0c;可信数据空间会议召开。大数据系统软件国家工程研究中心总工程师王晨发表了题为《基于可信数据空间的企业数据要素与流通体系建设》主旨演讲。 WeChat Subscription Account【智慧城市指北】&#xff0c;可搜索相关关键字“20250107”&#xff0c;可获取具体获…...

    处理 this

    this指向改变this this指向 构造函数和原型对象都指向 实例 改变this指向的三个方法&#xff1a; call()apply()bind() call() apply() 与call的区别就是call中参数任意&#xff0c;但是apply中参数必须是数组 bind&#xff08;&#xff09;&#xff08;最重要&#xff09; 与…...

    kafka服务端之日志存储

    文章目录 日志布局日志索引日志清理日志删除基于时间基千日志大小基于日志起始偏移量 日志压缩总结 日志布局 Ka饮a 中的消息是以主题为基本单位进行归类的&#xff0c; 各个主题在逻辑 上相互独立。 每个主题又可以分为一个或多个分区&#xff0c; 分区的数量可以在主题创建的…...

    【Apache Paimon】-- 15 -- 利用 paimon-flink-action 同步 postgresql 表数据

    利用 Paimon Schema Evolution 核心特性同步变更的 postgresql 表结构和数据 1、背景信息 在Paimon 诞生以前,若 mysql/pg 等数据源的表结构发生变化时,我们有几种处理方式 (1)人工消息通知,然后手动同步到数据仓库中(2)使用 flink 消费 DDL binlog ,然后自动更新 Hi…...

    正则表达式进阶(二)——零宽断言详解:\b \B \K \z \A

    在正则表达式中&#xff0c;零宽断言是一种非常强大的工具&#xff0c;能够在不消费字符的情况下对匹配位置进行约束。除了环视&#xff08;lookahead 和 lookbehind&#xff09;以外&#xff0c;还有一些常用的零宽断言&#xff0c;它们用于处理边界、字符串的开头和结尾等特殊…...

    java poi Excel 文件导入导出常见错误及解决方案

    在使用 Apache POI 进行 Excel 文件的导入导出操作时&#xff0c;可能会遇到各种问题。以下是一些常见的错误及其解决方案&#xff1a; 一、文件格式相关问题 1. 文件格式不兼容 问题描述&#xff1a;尝试使用 HSSFWorkbook 读取 .xlsx 文件&#xff0c;或者使用 XSSFWorkbo…...

    批量提取word表格数据到一个excel

    新建一个excel到word同级目录altf11打开vba窗口并新建模块粘贴下方代码&#xff08;修改一些必要参数&#xff09;回到excel表格界面&#xff0c;altf8选择执行该宏注意要在信任中心开启运行vba宏 Sub 批量提取word表格数据到excel()Dim wdApp As Object, wdDoc As ObjectDim …...

    快速建立私有化知识库(私有化训练DeepSeek,通过ollama方式)

    简介 什么&#xff1f;&#xff01;老是有人问你需求&#xff0c;不同版本的需求你记不清还得去扒拉过程文档、设计文档&#xff1f; 什么&#xff1f;&#xff01;领导会询问功能使用情况、用户相关数据&#xff0c;你每次还得手动查询反馈&#xff1f; 什么&#xff1f;&…...

    python 一句话打印行号

    在C语言中&#xff0c;打印行号可以直接用预定义的宏__LINE__&#xff0c;打印当前行号&#xff0c;方便调试。 printf("%d", __LINE__); // C语言打印当前行号 python中没有这样的预定义宏。 但可以用这种方式&#xff0c;实现一句话打印行号&#xff1a; impor…...

    设计模式-生产者消费者模型

    阻塞队列&#xff1a; 在介绍生产消费者模型之前&#xff0c;我们先认识一下阻塞队列。 阻塞队列是一种支持阻塞操作的队列&#xff0c;常用于生产者消费者模型&#xff0c;它提供了线程安全的队列操作&#xff0c;并且在队列为空或满时&#xff0c;能够阻塞等待&#xff0c;…...

    Kubernetes是什么?为什么它是云原生的基石

    从“手工时代”到“自动化工厂” 想象一下&#xff0c;你正在经营一家工厂。在传统模式下&#xff0c;每个工人&#xff08;服务器&#xff09;需要手动组装产品&#xff08;应用&#xff09;&#xff0c;效率低下且容易出错。而Kubernetes&#xff08;k8s&#xff09;就像一个…...

    全国计算机等级考试(NCRE)四级计算机网络考试大纲(2025年版)

    文章目录 基本要求1. 理解计算机网络的基本概念。2. 掌握局域网的基本工作原理。局域网&#xff08;LAN&#xff09;基本工作原理 3. 掌握TCP/IP及其相关协议。 TCP/IP协议及其相关协议1. TCP/IP协议的分层结构2. 主要协议详解&#xff08;1&#xff09;IP协议&#xff08;2&am…...

    扩展知识--缓存和分时复用cpu

    在多核CPU中&#xff0c;缓存和分时复用CPU是两个重要的概念&#xff0c;它们分别涉及硬件架构和资源管理策略。以下将从缓存的层次结构、工作原理以及分时复用CPU的概念进行详细解释。 一、多核CPU中的缓存 缓存的定义与作用 缓存&#xff08;Cache&#xff09;是位于CPU与主…...

    6.Centos7上部署flask+SQLAlchemy+python+达梦数据库

    情况说明 前面已经介绍了window上使用pycharm工具开发项目时,window版的python连接达梦数据库需要的第三方包。 这篇文章讲述,centos7上的python版本连接达梦数据库需要的第三方包。 之前是在windows上安装达梦数据库的客户端,将驱动包安装到windows版本的python中。(开…...

    如何将3DMAX中的3D文件转换为AutoCAD中的2D图形?

    大家好,今天我们来探讨一下如何将3DMAX中的3D文件转换为AutoCAD中的2D图形。无论是出于设计交流、施工准备还是其他实际需求,这种转换在工程设计领域都是一项非常实用的技能。接下来,我将为大家详细介绍几种实现这一转换的方法,帮助大家轻松跨越3D与2D设计之间的鸿沟。让我…...

    使用LLaMA Factory踩坑记录

    前置条件&#xff1a;电脑显卡RTX 4080 问题&#xff1a;LLaMA-Factory在运行的时候&#xff0c;弹出未检测到CUDA的报错信息 结论&#xff1a;出现了以上的报错&#xff0c;主要可以归结于以下两个方面&#xff1a; 1、没有安装GPU版本的pytorch&#xff0c;下载的是CPU版本…...

    四柱预测学

    图表 后天八卦 十二地支不仅代表了时间,还代表了方位。具体来说: ‌子‌:代表正北方‌丑寅‌:合起来代表东北方‌卯‌:代表正东方‌辰巳‌:合起来代表东南方‌午‌:代表正南方‌未申‌:合起来代表西南方‌酉‌:代表正西方‌戌亥‌:合起来代表西北方‌四季-五行-六神…...

    使用 JFreeChart 创建动态图表:从入门到实战

    文章目录 前言一、JFreeChart 简介二、环境准备三、 创建第一个折线图四、自定义图表样式4.1 设置背景色4.2 设置折线颜色4.3 设置字体&#xff08;解决中文乱码&#xff09;4.4 设置横坐标的标签宽度和方向 五、导出图表六、实战&#xff1a;动态生成日报图表总结 前言 在数据…...

    【自学笔记】文言一心的基础知识点总览-持续更新

    提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 文心一言知识点总览一、文心一言简介二、文心一言的核心功能三、文心一言的技术特点四、文心一言的应用场景五、文心一言的使用技巧六、文心一言的未来发展 总结 文…...

    解锁AI语音魅力——yoyo鹿鸣在线语音合成器,让创意声音即刻绽放!

    yoyo鹿鸣-在线语音合成 人工智能语音克隆生成&#xff0c;二次元&#xff5e; AI工具 | AI探金 可以在AI探金社区来找我&#xff5e; yoyo鹿鸣 - 在线语音生成器 需求人群&#xff1a; 有语音合成需求的用户。 使用场景示例&#xff1a; 合成yoyo鹿鸣语音 等等 产品特色&a…...

    【无标题】堆

    [TOC](优先级队列&#xff08;堆&#xff09;) 【本节目标】 1. 掌握堆的概念及实现 2. 掌握 PriorityQueue 的使用 # 1. 优先级队列 ## 1.1 概念 前面介绍过队列&#xff0c;**队列是一种先进先出(FIFO)的数据结构**&#xff0c;但有些情况下&#xff0c;**操作的数据可…...

    【工具变量】上市公司企业绿色新闻数据(2013-2023年)

    测算方式&#xff1a; 参考《中国工业经济》周泽将(2023)老师的做法&#xff0c;首先通过网络爬虫的方法检索并爬取上市公司相关新闻&#xff0c;并辅以人工检索补充校对&#xff1b;新闻文本清理&#xff0c;并通过公司相关性判定以及主题模型识别该新闻是否为上市公司环保主…...

    【vue】高德地图AMap.Polyline动态更新画折线,逐步绘制

    可以使用 setTimeout 或 setInterval 来逐个点绘制折线&#xff0c;确保每次添加新的点到 path 并更新 Polyline&#xff0c;如下所示&#xff1a; localPolyline(path) {console.log(逐点绘制 polyline...);let drawnPath []; // 用于存储当前绘制的点let index 0;let poly…...

    Lecture8 | LPV VXGI SSAO SSDO

    Review: Lecture 7 | Lecture 8 LPV (Light Propagation Volumes) Light Propagation Volumes(LPV)-孤岛惊魂CryEngine引进的技术 LPV做GI快|好 大体步骤&#xff1a; Step1.Generation of Radiance Point Set Scene Representation 生成辐射点集的场景表示&#xff1a;辐射…...

    三种Excel文本连接方法!

    大家好&#xff0c;我是小鱼。 在处理Excel表格数据时&#xff0c;有时需要对表格某些单元格中的文本进行连接组合。今天就跟大家分享3种Excel文本连接方法&#xff01;学会后遇到Excel文本连接问题也不求人&#xff01; 方法一、使用&符号连接 使用&符号连接文本的话…...

    ubuntu 本地部署deepseek r1 蒸馏模型

    本文中的文件路径或网络代理需要根据自身环境自行删改 一、交互式chat页面 1.1 open-webui 交互窗口部署&#xff1a;基于docker安装&#xff0c;且支持联网搜索 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台&#xff0c;旨在完全离线操作。它支持各种 LLM…...

    如何删除本地大模型

    随着Deepseep模型的爆火&#xff0c;越来越多的用户尝试在本地安装并体验这一强大的AI工具。然而&#xff0c;许多人在安装过程中发现&#xff0c;模型默认会安装在C盘&#xff0c;而C盘的空间通常有限&#xff0c;尤其是对于那些系统盘容量较小的用户来说&#xff0c;这无疑是…...

    【共享文件夹】使用Samba服务可在Ubuntu和Windows系统之间共享一个实际的文件夹

    目标&#xff1a;在Ubuntu和Windows系统之间共享一个实际的文件夹&#xff0c;并能够共同编辑其中的文件 安装Samba创建共享文件夹配置Samba设置Samba密码重启Samba服务以应用更改&#xff1a;在Windows中访问共享文件夹如果客户机无法访问 Samba 服务器&#xff0c;解决方法①…...

    用Llama Factory单机多卡微调Qwen2.5时报torch.OutOfMemoryError: CUDA out of memory的解决办法

    接着上一篇博客&#xff1a;在Ubuntu上用Llama Factory命令行微调Qwen2.5的简单过程_llamafactory 微调qwen 2.5-CSDN博客 如果需要微调比较大的模型&#xff0c;例如Qwen2.5-32B&#xff0c;那么在两个3090上可能不够用&#xff0c;这里我用A60004的服务器。但如果仿照上篇博…...

    第 26 场 蓝桥入门赛

    3.电子舞龙【算法赛】 - 蓝桥云课 问题描述 话说这年头&#xff0c;连舞龙都得电子化&#xff01;这不&#xff0c;蓝桥村的老程序员王大爷突发奇想&#xff0c;用LED灯带和一堆传感器鼓捣出了一条“电子舞龙”&#xff0c;它能根据程序指令在村里的广场上“翩翩起舞”。 广…...

    文华财经期货支撑压力多空K线变色期货指标,博易大师指标公式大全

    低线:25,DOT; 中线:55,DOT; 高线:85,DOT; LOWV:LLV(LOW,9); HIGHV:HHV(HIGH,9); RSV:EMA((CLOSE-LOWV)/(HIGHV-LOWV)*100,3); K:EMA(RSV,3); 趋势线:MA(K,3); DBA:K-趋势线; STICKLINE(DBA>0,(K-DBA*0.1),(K-DBA*0.75),2,0),COLORRED; STICKLINE(DBA<0,(趋势线DBA*0.1),…...