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

ListNode相关

目录

2. 链表相关题目

2.1 合并两个有序链表(简单):递归

2.2 删除排序链表中的重复元素(简单):一次遍历

2.3 两链表相加(中等):递归

2.4 删除链表倒数第N个节点(中等):倒数第N个元素是遍历的第L-N+1个元素

2.5 两两交换链表中的节点(中等):递归

2.6 旋转链表(中等):链表成环后断开

2.7 判断是否存在环形链表(简单):Set集合 + 重复判断

2.8 环形链表若存在返回其入环的第一个节点(中等):Set集合 + 重复判断

2.9 LRU缓存(中等,也可以说困难):哈希表 + 双向链表

2.10 反转链表(简单):迭代

2.11 分隔链表(中等):

2.12 反转给定节点处的链表(中等):穿针引线

2.13 链表的总结

2. 链表相关题目

2.1 合并两个有序链表(简单):递归

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

思想:将两个链表头部值中较小的一个节点和剩下元素的merge操作合并


总结:将链表头部单独拿出来先比较,比较完后确立了合并链表的头部,剩下的元素按照这种思路继续比较


代码:

class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {//判断 list1 或者 list2 是否为空,为空则直接返回if(list1 == null){return list2;}else if(list2 == null){return list1;}//如果list1头部更小,则list1头部作为合并后链表的头部,然后继续合并其它链表else if(list1.val < list2.val){list1.next = mergeTwoLists(list1.next, list2);return list1;}//如果list2头部更小,则list2头部作为合并后链表的头部,然后继续合并其它链表else{list2.next = mergeTwoLists(list1,list2.next);return list2;}}
}

2.2 删除排序链表中的重复元素(简单):一次遍历

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

思想:给定的链表是已经排好序的,重复的元素在链表中出现的位置是连续的;因此我们比较curr和curr.next,若相等则删除curr.next


总结:curr.next不为空时判断:curr和curr.next是否相等

  • 相等则删除curr.next;

  • 不相等则继续判断下一个节点


代码:

class Solution {public ListNode deleteDuplicates(ListNode head) {if (head == null) {return head;}
​ListNode cur = head;while (cur.next != null) {if (cur.val == cur.next.val) {cur.next = cur.next.next;} else {cur = cur.next;}}
​return head;}
}

2.3 两链表相加(中等):递归

题目:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

思想:链表都是逆序存储数字的,因此链表中同一位置的数可以直接相加;且

  • sum = l1.val + l2.val + carry

  • 存入结果链表的是 % 10之后的值

  • 下一次的carry是 / 10之后的值


总结:使用递归法,将每一次的sum求出,然后十进制转换后存入结果链表


代码:

class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {return add(l1, l2, 0);}
​public ListNode add(ListNode l1, ListNode l2, int carry){//如果l1、l2为空,且此时carry进位为0;则返回nullif(l1 == null && l2 == null && carry == 0){return null;}//sum = l1.val + l2.val + carryif(l1 != null){carry += l1.val;l1 = l1.next;}if(l2 != null){carry += l2.val;l2 = l2.next;}//将相加后的数 % 10,然后存入结果链表ListNode result = new ListNode(carry % 10);
​//递归:并将新的carry值传入,为下一次sum做准备result.next = add(l1, l2, carry / 10);
​return result;}
}

2.4 删除链表倒数第N个节点(中等):倒数第N个元素是遍历的第L-N+1个元素

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

思想:首先得到链表的长度L,从头节点开始遍历到第L - N + 1个节点时,该节点就是需要删除的节点;


总结:创建一个哑节点,用来指向链表的第一个节点;从头节点开始遍历1 --> L - N - 1,该节点的下一个节点即是待删除元素


代码:

class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {//创建一个哑节点,指向第一个元素ListNode dummy = new ListNode(0,head);
​//获取链表长度int length = getLength(head);
​//将哑节点作为当前元素ListNode curr = dummy;
​//获得倒数第N个节点的前一个结点:从i = 1 遍历到l - n + 1之前,第l - n + 1个节点就是该节点for(int i = 1; i < length - n + 1; i++){//每遍历一次,都将下一个节点值赋给该节点curr = curr.next;}
​//遍历完后,下一个节点值就是待删除节点值curr.next = curr.next.next;
​ListNode result = dummy.next;return  result;
​}
​public int getLength(ListNode head){int length = 0;while(head != null){length++;head = head.next;}return length;}
}

2.5 两两交换链表中的节点(中等):递归

题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题

思想:首先交换头节点和第二个节点的位置,然后递归的实现第三个节点、第四个节点、、、的交换;结束条件是链表中没有节点或者只剩下一个节点

  • 原始链表的头节点head:新链表的第二个节点

  • 原始链表的第二个节点:新链表的头节点newhead

  • 原始链表其他节点的头节点:newhead

  • 原始链表其他节点交换后是放在原始链表头部节点(此时是新链表的第二个节点)的后面的


总结:重点是交换时的顺序:

  • 先找到新链表的头节点

  • 然后根据新链表的头节点找到该节点在原始链表中的下一个节点来递归

  • 最后将原始节点的头节点作为新链表的第二个节点


代码:

class Solution {public ListNode swapPairs(ListNode head) {if(head == null || head.next == null){return head;}
​//原始链表头部的下一个节点就是新链表的头节点ListNode newHead = head.next;//这两行的顺序不能变化,因为此时是对原始链表的第三个节点进行的交换,若先将head赋值给newHead.next就没有了意义//新链表头节点在原始链表中的下一个节点(第三个节点)就是head的下一个节点head.next = swapPairs(newHead.next);
​//head是新链表节点的下一个节点newHead.next = head;
​return newHead;}
}

2.6 旋转链表(中等):链表成环后断开

题目:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

思想:若链表长度为n则:

  • 若向右移动的k >= n时,实际上移动k mod n

  • 新链表的最后一个节点是原链表的第 (n-1)-(k mod n)个节点

  • 将链表连接成环:将链表的尾节点连接上头节点,然后找到新链表的最后一个节点,将其断开即可


总结:创建一个哑节点,用来指向链表的第一个节点;从头节点开始遍历1 --> L - N - 1,该节点的下一个节点即是待删除元素


代码:

class Solution {public ListNode rotateRight(ListNode head, int k) {//1.若不移动或者根节点为空或者只有一个根节点if(k == 0 || head == null || head.next == null){return head;}
​//2.计算出链表长度(从1开始计数,此时即head一定有值)int n = 1;ListNode curr = head;while(curr.next != null){n++;curr = curr.next;}
​//3.新链表的最后一个节点是原链表的第n - k mod n个节点(从1开始计数)int add = n - k % n;//如果最后一个节点n - k mod n等于原链表的第n个节点,说明k为n的倍数,不需要旋转if(add == n){return head;}
​//4.将链表成环,然后找到新链表的最后一个节点(原链表的第n -(k mod n)个节点),将其断开curr.next = head; //链表成环
​//找到旋转后新链表的最后一个节点while(add > 0){curr = curr.next;add--;}//闭环中,新链表的最后一个节点的下一个节点就是新链表的头节点ListNode result = curr.next;
​//将环断开curr.next = null;
​return result;
​}
}

2.7 判断是否存在环形链表(简单):Set集合 + 重复判断

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

思想:遍历所有节点,每遍历到一个节点,就存入哈希表中,并判断该节点是否被访问过(如果存在环形链表,则遍历的过程中会出现环形链表的节点会被访问两次,第一个被访问两次的节点就是环形链表的头节点位置),若访问过则说明是环形链表


总结:遍历链表,存入set集合,利用set集合的自身特性来判断


代码:

public class Solution {public boolean hasCycle(ListNode head) {//用一个HashSet集合存储每次遍历过程中链表中的节点Set<ListNode> set = new HashSet<>();
​while(head != null){//set是无需不可重复的,若set.add()返回false,说明已添加过该节点if(!set.add(head)){return true;}//节点后移head = head.next;}
​//遍历结束仍不存在相同节点,说明没有环形链表存在return false;}
}

2.8 环形链表若存在返回其入环的第一个节点(中等):Set集合 + 重复判断

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

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

思想:遍历所有节点,每遍历到一个节点,就存入哈希表中,并判断该节点是否被访问过(如果存在环形链表,则遍历的过程中会出现环形链表的节点会被访问两次,第一个被访问两次的节点就是环形链表的头节点位置),若访问过则说明是环形链表,且第一个访问到的重复访问节点就是入环的第一个节点


总结:遍历链表,存入set集合,利用set集合的自身特性来判断:如果存在则直接返回该节点,不存在则加入set中


代码:

public class Solution {public ListNode detectCycle(ListNode head) {//创建存储集合setSet<ListNode> set = new HashSet<>();ListNode curr = head;
​//遍历链表中的所有值while(curr != null){//判断是否存在重复节点:存在一定是第一个节点,直接返回,不存在则继续遍历下一个if(set.contains(curr)){return curr;}else{set.add(curr);}curr = curr.next;}//不存在返回nullreturn null;}
}

2.9 LRU缓存(中等,也可以说困难):哈希表 + 双向链表

题目:请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构

实现 LRUCache 类:

  • LRUCache(int capacity)正整数 作为容量 capacity 初始化 LRU 缓存

  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1

  • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity则应该 逐出 最久未使用的关键字

函数 getput 必须以 O(1) 的平均时间复杂度运行。

思想:

LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对。

  • 双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的键值对是最久未使用的。

  • 哈希表即为普通的哈希映射(HashMap),通过缓存数据的键映射到其在双向链表中的位置。

这样以来,我们首先使用哈希表进行定位,找出缓存项在双向链表中的位置,随后将其移动到双向链表的头部,即可在 O(1)O(1)O(1) 的时间内完成 get 或者 put 操作。具体的方法如下:

  • 对于get 操作,首先判断 key 是否存在:

    • 如果 key不存在,则返回 −1

    • 如果key 存在,则key 对应的节点是最近被使用的节点。通过哈希表定位到该节点在双向链表中的位置,并将其移动到双向链表的头部,最后返回该节点的值。

  • 对于put操作,首先判断 key是否存在:

    • 如果 key 不存在,使用keyvalue 创建一个新的节点,在双向链表的头部添加该节点,并将 key和该节点添加进哈希表中。然后判断双向链表的节点数是否超出容量,如果超出容量,则删除双向链表的尾部节点,并删除哈希表中对应的项;

    • 如果key 存在,则与get操作类似,先通过哈希表定位,再将对应的节点的值更新为 value,并将该节点移到双向链表的头部。


总结:遍历链表,存入set集合,利用set集合的自身特性来判断:如果存在则直接返回该节点,不存在则加入set中


代码:

class LRUCache {class MyLinkedNode{int key;int value;MyLinkedNode prev;MyLinkedNode next;public MyLinkedNode(){}public MyLinkedNode(int key,int value){this.key = key;this.value = value;}}//需要使用哈希表和双向链表需要自己实现来实现//哈希表用来快速定位缓存中的元素所在位置,从而方便的get与put;哈希表中存储索引值和双向链表值,链表有key及valueprivate Map<Integer,MyLinkedNode> cache = new HashMap<>();
​//记录链表长度private int size;//记录LRU容量private int capacity;//定义两个哑节点用来指向链表的头尾节点private MyLinkedNode head;private MyLinkedNode tail;
​//创建时:定义LRU的size与capacity;并创建头尾伪节点public LRUCache(int capacity) {this.size = size;this.capacity = capacity;//构建头尾指针head = new MyLinkedNode();tail = new MyLinkedNode();head.next = tail;tail.prev = head;}//get时:先判断Map是否存在该节点,若不存在返回-1;若存在则将其展示,并把它移动到双向链表的头部public int get(int key) {MyLinkedNode node = cache.get(key);if(node == null){return -1;}//将节点移动到双向链表的头部moveToHead(node);return node.value;}//put时:先判断Map中是否存在该节点,若存在则直接改变value,并将其移动到头部;//若不存在,则将其添加到哈希表和链表头部,并判断当链表长度size>LRU容量则将链表尾部节点删除public void put(int key, int value) {MyLinkedNode node = cache.get(key);if(node != null){//存在该节点则改变其value值node.value = value;moveToHead(node);}else{//将节点添加到链表和哈希表中,然后移动到链表头部MyLinkedNode newNode = new MyLinkedNode(key,value);cache.put(key,newNode);addToHead(newNode);size++;
​//判断是否超出容量:超出则在链表和哈希表中删除尾部节点if(size > capacity){MyLinkedNode tail = removeTail();cache.remove(tail.key);size--;}}}
​public void moveToHead(MyLinkedNode node){removeNode(node);addToHead(node);}
​//删除节点public void removeNode(MyLinkedNode node){node.prev.next = node.next;node.next.prev = node.prev;}
​//将节点添加到头部public void addToHead(MyLinkedNode node){node.prev = head;node.next = head.next;head.next.prev = node;head.next = node;}
​//删除尾部节点:拿到尾部节点,然后删除并返回删除后的节点public MyLinkedNode removeTail(){MyLinkedNode result = tail.prev;removeNode(result);return result;}
}

2.10 反转链表(简单):迭代

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

思想:遍历链表,让遍历的节点的next指向前一个节点;注意:头节点没有引用前一个节点,因此要先存储一个前节点为null;并且要创建一个新节点,最终返回新的链表头部


总结:在进行反转时,需要变化的量有:节点值(为了迭代变为下一个节点值)、节点的下一个值(指向节点的上一个值)、节点的上一个值(为了迭代每次变为上一次迭代的当前节点值)


代码:

class Solution {public ListNode reverseList(ListNode head) {//创建一个空节点,用来指向nullListNode prev = null;//创建一个临时节点ListNode curr = head;
​//如果当前节点不为空:反转链表时://当前节点的下一个节点先存下来,然后将让当前节点的next指向前一个结点;//每轮循环中,前一个节点都是上一次循环的当前节点while(curr != null){ListNode next = curr.next;curr.next = prev;prev = curr;curr = next;}return prev;}
}

2.11 分隔链表(中等):

题目:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 保留 两个分区中每个节点的初始相对位置

思想:维护两个链表samll和large,按照顺序分别存储小于x的节点值和大于等于x的节点值,最后将前一个链表的尾节点指向钱一个链表的头节点即可


总结:为防止头节点的边界条件(需要对头节点进行特殊判断,为了防止这个特殊判断),设置一个哑节点指向头节点


代码:

class Solution {public ListNode partition(ListNode head, int x) {//创建两个链表,分别用来存储小于x和大于等于x的节点ListNode small = new ListNode(0);ListNode large = new ListNode(0);
​//创建两个哑节点,此时哑节点并不指向新链表的头节点,而是等于头节点(后面讲头节点改为新添加的节点)ListNode smallHead = small;ListNode largeHead = large;
​//遍历当前链表值,根据与x的比较存入两个新链表while(head != null){//将小于x的节点存入small链表,并更改头部if(head.val < x){small.next = head;small = small.next;}//将大于等于x的节点存入large链表,并更改头部else{large.next = head;large = large.next;}head = head.next;}//将samll的尾节点指向large的头节点small.next = largeHead.next;//将large的尾节点指向nullarge.next = null;return smallHead.next;}
}

2.12 反转给定节点处的链表(中等):穿针引线

题目:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 保留 两个分区中每个节点的初始相对位置

思想:先将需要反转的位置进行反转得到反转后链表,然后将left的前一个节点prev指向反转后的链表的头部,将反转后链表的尾部指向right的next节点即可


总结:只要是头节点可能发生变化的情况,都设置一个哑节点,用来处理这种特殊情况;


代码:

class Solution {public ListNode reverseBetween(ListNode head, int left, int right) {//创建一个哑节点,指向链表头部ListNode dummy = new ListNode();dummy.next = head;
​//一开始记left的前一个节点为哑节点,然后从哑节点出发走left - 1步,找到left节点的前一个节点prevListNode prev = dummy;for(int i = 0; i < left - 1; i++){prev = prev.next;}
​//从prev出发,走right - left + 1 步,找到right节点ListNode rightNode = prev;for(int i = 0; i < right - left + 1; i++){rightNode = rightNode.next;}
​//先将prev的下一个节点left和rightNode的下一个节点next保存起来,然后将链表截断ListNode leftNode = prev.next;ListNode next = rightNode.next;prev.next = null;rightNode.next = null;
​//将截断后的元素进行反转reverseListNode(leftNode);
​//让prev节点指向新链表的头节点(rightNode),新链表的尾节点(leftNode)指向保存下的next节点prev.next = rightNode;leftNode.next = next;return dummy.next;
​}
​public void reverseListNode(ListNode head){ListNode prev = null;ListNode curr = head;while(curr != null){ListNode next = curr.next;curr.next = prev;prev = curr;curr = next;}}
}

2.13 链表的总结

链表主要注意几点:

  • 对于头节点可能发生变化的情况,可以设置一个哑节点,用来指向头节点,从而减少对头节点特殊情况的判断;同理,特殊情况也可以构造尾节点的哑节点

  • 链表中的指针很神奇,能够控制链表的指向,若指向null或者指向头部就能轻松改变一个链表的状态,使之断开或者成环,谨慎改变指针的指向,能够解决很多问题

  • 在树结构中很多时候可以使用递归,链表中也一样,因为都是一样的结构,构造好递归函数就能省去很多时间

相关文章:

ListNode相关

目录 2. 链表相关题目 2.1 合并两个有序链表&#xff08;简单&#xff09;&#xff1a;递归 2.2 删除排序链表中的重复元素&#xff08;简单&#xff09;&#xff1a;一次遍历 2.3 两链表相加&#xff08;中等&#xff09;&#xff1a;递归 2.4 删除链表倒数第N个节点&…...

docker的资源控制及docker数据管理

目录 一.docker的资源控制 1.CPU 资源控制 1.1 资源控制工具 1.2 cgroups有四大功能 1.3 设置CPU使用率上限 1.4 进行CPU压力测试 1.5 设置50%的比例分配CPU使用时间上限 1.6 设置CPU资源占用比&#xff08;设置多个容器时才有效&#xff09; 1.6.1 两个容器测试cpu 2&…...

通过请求头传数据向后端发请求

axios &#xff08;get post请求、头部参数添加&#xff09;傻瓜式入门axios_axiospost请求参数_web_blog的博客-CSDN博客...

产品流程图是什么?怎么做?

产品流程图是什么&#xff1f; 产品流程图是一种图形化的表达方式&#xff0c;用于描述产品开发、制造、销售、使用等各个阶段中涉及的流程、步骤和关系。它通过图形符号、箭头、文本等元素&#xff0c;展示了产品的各个环节之间的关联和顺序&#xff0c;通常被用于可视化产…...

面试之快速学习STL-map

关联式容器 包括 map、multimap、set 以及 multiset 这 4 种容器。和序列式容器区别&#xff1a; a . 关联式容器在存储元素时还会为每个元素在配备一个键&#xff0c;整体以键值对的方式存储到容器中。 b . 相比前者&#xff0c;关联式容器可以通过键值直接找到对应的元素&am…...

ES的索引结构与算法解析

提到ES&#xff0c;大多数爱好者想到的都是搜索引擎&#xff0c;但是明确一点&#xff0c;ES不等同于搜索引擎。不管是谷歌、百度、必应、搜狗为代表的自然语言处理(NLP)、爬虫、网页处理、大数据处理的全文搜索引擎&#xff0c;还是有明确搜索目的的搜索行为&#xff0c;如各大…...

32.Netty源码之服务端如何处理客户端新建连接

highlight: arduino-light 服务端如何处理客户端新建连接 Netty 服务端完全启动后&#xff0c;就可以对外工作了。接下来 Netty 服务端是如何处理客户端新建连接的呢&#xff1f; 主要分为四步&#xff1a; md Boss NioEventLoop 线程轮询客户端新连接 OP_ACCEPT 事件&#xff…...

代码随想录day11

20. 有效的括号 ● 力扣题目链接 ● 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串&#xff0c;判断字符串是否有效。 ● 有效字符串需满足&#xff1a; ● 左括号必须用相同类型的右括号闭合。 ● 左…...

RabbitMQ实习面试题

RabbitMQ实习面试题 在 RabbitMQ 中&#xff0c;确保生产者消息正确发布以及确保消费者已经消费是非常重要的任务。以下是一些方法和策略&#xff0c;可以帮助您在 RabbitMQ 中实现这些目标&#xff1a; 确保生产者消息正确发布&#xff1a; 持久化消息&#xff1a;将消息设…...

Electron入门,项目运行,只需四步轻松搞定。

electron 简单介绍&#xff1a; 实现&#xff1a;HTML/CSS/JS桌面程序&#xff0c;搭建跨平台桌面应用。 electron 官方文档&#xff1a; [https://electronjs.org/docs] 本文是基于以下2篇文章且自行实践过的&#xff0c;可行性真实有效。 文章1&#xff1a; https://www.cnbl…...

【C++】visualstudio环境安装

记录了部分安装步骤&#xff0c;可能有点不全&#xff0c;参考下&#xff0c;需要的磁盘空间差不多20GB&#xff1b; 下载 https://visualstudio.microsoft.com/zh-hans/vs/ 下载完成&#xff1a; 双击进入安装状态&#xff1a; 根据自己的需求勾选安装项&#xff1a; 选择…...

使用MySQL:5.6和owncloud镜像搭建个人网盘

拉取镜像 [rootkvm ~]# docker pull mysql:5.6[rootkvm ~]# docker pull owncloud启动mysql容器 [rootkvm ~]# docker run -d --name db1 -e MYSQL_ROOT_PASSWORDroot mysql:5.6 db832e4e4333a0e9a7c152a67272721fdbe5381054090c5eb24f90455390a852 [rootkvm ~]# docker ps …...

php中创建对象时传递的参数是构造方法

PHP中创建对象时&#xff0c;可以通过构造方法的参数来传递参数值。构造方法是一个特殊的方法&#xff0c;在创建对象时会自动调用&#xff0c;用于进行对象的初始化操作。 以下是一个示例代码&#xff0c;展示了如何在PHP中使用构造方法传递参数&#xff1a; class MyClass …...

C++并发及互斥保护示例

最近要写一个多线程的并发数据库&#xff0c;主要是希望使用读写锁实现库的并发访问&#xff0c;同时考虑到其他平台(如Iar)没有C的读写锁&#xff0c;需要操作系统提供&#xff0c;就将读写锁封装起来。整个过程还是比较曲折的&#xff0c;碰到了不少问题&#xff0c;在此就简…...

新手常犯的错误,anzo capital昂首资本一招避免少走弯路

新手是不是经常交易中赚不到钱&#xff0c;今天anzo capital昂首资本就盘点一下新手常犯的错误&#xff0c;一招教你少走弯路。 一.随便选择交易账户 开立实时账户时选择正确的账户类型&#xff0c;anzo capital昂首资本教你比较所有提供的账户类型&#xff0c;选择最符合财务…...

Java Vue (el-date-picker组件) 前后端 关于时间格式数据的处理方法

前端使用 elment-ui 组件 el-date-picker 其中组件需要格式化时间&#xff0c;增加属性 value-format"yyyy-MM-dd" 后端 Java 接收参数类型 后端Dto 使用Date接收&#xff0c;并添加JsonFormat注解 JsonFormat(pattern"yyyy-MM-dd") private Date testTi…...

Python爬虫——scrapy_多条管道下载

定义管道类&#xff08;在pipelines.py里定义&#xff09; import urllib.requestclass DangDangDownloadPipelines:def process_item(self, item, spider):url http: item.get(src)filename ../books_img/ item.get(name) .jpgurllib.request.urlretrieve(url, filename…...

lombok启动不生效(什么方法都试了,可还是不生效怎么办 ?! 救救我)

使用IntelliJ IDEA 2021.1.3&#xff08;Ultimate Edition&#xff09;时提示Lombok不生效 java: You aren’t using a compiler supported by lombok, so lombok will not work and has been disabled. 方式一&#xff1a;我们手动更新一下版本到以下版本 <!--Lombok--&…...

element文本域禁止手动拉伸、两种方式、textarea

文章目录 style方式element自带的禁止拉伸方法建议 style方式 html <el-inputv-model"content":rows"3"class"r_n"type"textarea"maxlength"40"placeholder""style"height: 100%;" />css style…...

c#中lambda表达式缩写推演

Del<string> ml new Del<string>(Notify);//泛型委托的实例化&#xff0c;并关联Nofity方法 Del<string> ml new Del<string>(delegate (string str) { return str.Length; });//将Nofity变更为匿名函数 Del<string> ml delegate(string str)…...

无涯教程-PHP - 循环语句

PHP中的循环用于执行相同的代码块指定的次数。 PHP支持以下四种循环类型。 for - 在代码块中循环指定的次数。 while - 如果且只要指定条件为真&#xff0c;就会循环遍历代码块。 do ... while - 循环执行一次代码块&#xf…...

思维进化算法(MEA)优化BP神经网络

随着计算机科学的发展,人们借助适者生存这一进化规则,将计算机科学和生物进化结合起来,逐渐发展形成一类启发式随机搜索算法,这类算法被称为进化算法(Evolutionary Com-putation, EC)。最著名的进化算法有:遗传算法、进化策略、进化规划。与传统算法相比,进化算法的特点是群体搜…...

Kotlin 中的 设计模式

单例模式 饿汉模式 饿汉模式在类初始化的时候就创建了对象&#xff0c;所以不存在线程安全问题。 局限性&#xff1a; 1、如果构造方法中有耗时操作的话&#xff0c;会导致这个类的加载比较慢&#xff1b; 2、饿汉模式一开始就创建实例&#xff0c;但是并没有调用&#xf…...

Vulnhub: ICMP: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.208 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.208 80端口的cms为Monitorr 1.7.6m 搜索发现该版本的cms存在远程代码执行 searchsploit monitorr 漏洞利用 nc本地监听&…...

我的创作纪念日(C++修仙练气期总结)

分享自己最喜欢的一首歌&#xff1a;空想フォレスト—伊東歌詞太郎 机缘 现在想想自己在CSDN创作的原因&#xff0c;一开始其实就是想着拿着博客当做自己的学习笔记&#xff0c;笔记嘛&#xff0c;随便写写&#xff0c;自己看得懂就ok了的态度凸(艹皿艹 )。也是用来作为自己学习…...

css的常见伪元素使用

1.first-line 元素首行设置特殊样式。 效果演示&#xff1a; <div class"top"><p>可以使用 "first-line" 伪元素向文本的首行设置特殊样式。<br> 换行内容 </p></div> .top p::first-line {color: red;} 2.first-lette…...

91. 解码方法

递归法&#xff1a;超时了 从字符串的后面向前计算&#xff0c;每一次递归都缩小子集 public class Solution {public int NumDecodings(string s) {return RecursiveAdd(s, s.Length - 1);}public int RecursiveAdd(string s, int index) {// 已经到最后一个元素if(index <…...

docker搭建opengrok环境2

引言&#xff1a; 虚拟机关闭后重新开启&#xff0c;理论上是需要重新启动一下docker的&#xff0c;以重新启动其中的服务。 命令基础&#xff1a; docker images&#xff1a;查看docker中现有的镜像 docker container ls -all&#xff1a;查看docker中目前在运行的containe…...

【校招VIP】java语言考点之ConcurrentHashMap1.7和1.8

考点介绍&#xff1a; ConcurrentHashMap是JAVA校招面试的热门考点&#xff0c;主要集中在1.7和1.8的底层结构和相关的性能提高。 理解这个考点要从map本身的并发问题出发&#xff0c;再到hashTable的低性能并发安全&#xff0c;引申到ConcurrentHashMap的分块处理。同时要理解…...

php如何实现5x+2x+1x=100

要实现5x 2x 1x 100的计算&#xff0c;可以使用PHP来解方程。以下是一个简单的PHP代码示例&#xff1a; php <?php $x 1; // 初始化x的值while (5*$x 2*$x 1*$x ! 100) { // 循环直到方程成立$x; // 每次循环增加x的值 }echo "x " . $x; // 输出x的值 ?…...

机器人项目:从 ROS2 切换到 ROS1 的原因

一、说明 机器人操作系统ROS是使用最广泛的机器人中间件平台。它在机器人社区中使用了10多年&#xff0c;无论是在业余爱好者领域还是在工业领域。ROS可用于各种微控制器和计算机&#xff0c;从Arduino到Raspberry Pi再到Linux工作站&#xff0c;它为电机控制器&#xff0c;视觉…...

Vault主题 - UiCore多用途Elementor WordPress主题

你可以使用Vault主题 – UiCore多用途Elementor WordPress主题构建什么&#xff1f; Vault主题拥有专业、像素级完美且干净的现代布局&#xff0c;几乎适合您需要的任何网站&#xff1a; 小型企业网站企业网站着陆页面权威博客销售和营销页面网上商店 自由职业者的最佳选择 …...

G0第26章:微服务概述与gRPCprotocol buffers

Go微服务与云原生 1、微服务架构介绍 单体架构&#xff08;电商&#xff09; SOA架构&#xff08;电商&#xff09; 微服务架构&#xff08;电商&#xff09; 优势 挑战 拆分 发展史 第一代:基于RPC的传统服务架构 第二代:Service Mesh(istio) 微服务架构分层 核心组件 Summar…...

三款远程控制软件对比,5大挑选指标:安全、稳定、易用、兼容、功能

陈老老老板&#x1f934; &#x1f9d9;‍♂️本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f9d9;‍♂️本文简述&#xff1a;三款远程控制软件对比&#xff0c;5大挑选指标&#xff1…...

Java中static的应用之单例模式

单例模式是一种创建对象的设计模式&#xff0c;它保证一个类只有一个实例&#xff0c;并提供一个全局访问点。由于单例模式只允许存在一个实例&#xff0c;因此它可以节省系统资源并提高程序的性能。在许多情况下&#xff0c;单例模式在应用程序中都是非常有用的&#xff0c;例…...

TypeError: Cannot read properties of undefined (reading ‘container‘)

问题环境&#xff1a; element项目 el-table的错误 项目是由 webpack项目迁移为 vite项目 问题描述&#xff1a; errorLog.js?t1692581753160:17 TypeError: Cannot read properties of undefined (reading container) at unbind (infinite-scroll.js:259:31) …...

Vue--BM记事本

效果如下&#xff1a; 用到了如下的技术&#xff1a; 1.列表渲染&#xff1a;v-for key的设置 2.删除功能&#xff1a;v-on调用参数 fliter过滤 覆盖修改原数组 3.添加功能&#xff1a;v-model绑定&#xff0c;unshift修改原数组添加 html文件如下&#xff1a; <!DOCTYPE …...

openpnp - 板子上最小物料封装尺寸的选择

文章目录 openpnp - 板子上最小物料封装尺寸的选择概述END openpnp - 板子上最小物料封装尺寸的选择 概述 现在设备调试完了, 用散料飞达载入物料试了一下. 0402以上贴的贴别准, 贴片流程也稳, 基本不需要手工干预. 0201可以贴, 但是由于底部相机元件视觉识别成功率不是很高…...

什么是非功能性需求,它们如何影响产品开发?

我们在选购新车时&#xff0c;会预设一些选购的标准&#xff0c;比如GPS导航必须能够保存目的地&#xff0c;或者必须要买黑色的车。我们可能下意识以为这些是功能性需求&#xff0c;但实际上这些特性都是与用户体验相关的非功能性需求。 一、什么是非功能性需求(NFR)? 非功…...

Oracle jdk8 exe->zip

一、背景 目前Oracle网站对应jdk8安装windows仅存在exe安装包&#xff0c;对于某些用户一台机器上对应jdk版本需动态切换&#xff0c;故需使用zip版本jdk&#xff0c;更加方便&#xff0c;本文介绍如何从jdk对应exe提取zip。 二、步骤 下载jdk8对应exe安装包&#xff1b;使用…...

Android 命令行如何运行 JAR 文件

​ 最近有位老哥问了一个问题&#xff0c;说如果将java的jar文件在Android中执行&#xff1f;这个其实很简单的一个问题&#xff0c;直接写个App放里面不就可以了么&#xff1f;但是人家说没有App&#xff0c;直接使用命令行去运行。说明这个需求的时候&#xff0c;把我给整懵了…...

5.4 webrtc的线程

那今天呢&#xff1f;我们来了解一下webrtc中的threed&#xff0c;首先我们看一下threed的类&#xff0c;它里边儿都含了哪些内容&#xff1f;由于threed的类非常大啊&#xff0c;我们将它分成两部分。 那第一部分呢&#xff0c;是我们看threed的类中都包含了哪些数据之后呢&a…...

vscode | linux | c++ intelliense 被弃用解决方案

每日一句&#xff0c;vscode用的爽是爽&#xff0c;主要是可配置太强了。如果也很会研究&#xff0c;可以直接去咸鱼接单了 废话少说&#xff0c;直接整。 用着用着说是c intelliense被弃用&#xff0c;很多辅助功能无法使用&#xff0c;像查看定义、查看引用、函数跳转、智能提…...

HPE服务器常见报错信息以及解决方案

General controller issues 常规控制器问题 Controllers are no longer redundant 控制器不再冗余 HPE Dynamic Smart Array B140i drives are not found when RAID mode is disabled 禁用 RAID 模式时找不到 HPE 动态智能阵列 B140i 驱动器 Data located on drives accessed i…...

尚硅谷宋红康MySQL笔记 3-9

我不会记录的特别详细 大体框架 基本的Select语句运算符排序与分页多表查询单行函数聚合函数子查询 第三章 基本的SELECT语句 SQL分类 这个分类有很多种&#xff0c;大致了解下即可 DDL&#xff08;Data Definition Languages、数据定义语言&#xff09;&#xff0c;定义了…...

Leetcode.2337 移动片段得到字符串

题目链接 Leetcode.2337 移动片段得到字符串 rating : 1693 题目描述 给你两个字符串 start 和 target &#xff0c;长度均为 n n n 。每个字符串 仅 由字符 L、R 和 _ 组成&#xff0c;其中&#xff1a; 字符 L 和 R 表示片段&#xff0c;其中片段 L 只有在其左侧直接存在一…...

【vue】更改角色权限后,实现页面不刷新更改其可展示的导航菜单

登入的角色本身属于领导级别&#xff08;集团权限&#xff09;&#xff0c;没有下级的不同权限&#xff1a; 切换不同身份&#xff08;公司&#xff09;&#xff0c;以获得相应部门的不同导航菜单及权限 这里实现&#xff1a;更改角色权限后&#xff0c;实现页面 不刷新 更改…...

【G-LAB】网络工程师常用排错命令详细版

网络工程师在日常配置中难免出现各种配置错误&#xff0c;比如接口地址配错、掩码位数配错、接口忘记no shutdown。除去这些基础错误&#xff0c;在配置各种路由选择协议时也会因为网络类型、邻居类型、区域和路由器层级等各种问题使邻居无法建立、路由无法传递进而导致网络不通…...

Linux 桌面版关闭GUI桌面环境

持久打开和关闭 通过CtrlAltF1-F6快捷键进入命令行界面 执行以下命令&#xff0c;持久关闭Ubuntu桌面版的GUI环境&#xff1a; sudo systemctl set-default multi-user.target执行以下命令&#xff0c;持久开启Ubuntu桌面版的GUI环境 通过CtrlAltF7快捷键进入GUI界面 sudo s…...

ChatGPT能代替搜索引擎吗?ChatGPT和搜索引擎有什么区别?

ChatGPT和搜索引擎是两种在信息获取和交流中常用的工具&#xff0c;ChatGPT是一种基于人工智能技术的聊天机器人&#xff0c;而搜索引擎是一种在互联网上搜索信息的工具。尽管它们都是依托互联网与信息获取和交流有关&#xff0c;部分功能重合&#xff0c;但在很多方面存在着明…...