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
,则应该 逐出 最久未使用的关键字。
函数 get
和 put
必须以 O(1)
的平均时间复杂度运行。
思想:
LRU
缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对。
-
双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的键值对是最久未使用的。
-
哈希表即为普通的哈希映射(HashMap),通过缓存数据的键映射到其在双向链表中的位置。
这样以来,我们首先使用哈希表进行定位,找出缓存项在双向链表中的位置,随后将其移动到双向链表的头部,即可在 O(1)O(1)O(1) 的时间内完成 get 或者 put 操作。具体的方法如下:
-
对于
get
操作,首先判断key
是否存在:-
如果
key
不存在,则返回−1
;
-
如果
key
存在,则key
对应的节点是最近被使用的节点。通过哈希表定位到该节点在双向链表中的位置,并将其移动到双向链表的头部,最后返回该节点的值。
-
-
对于
put
操作,首先判断key
是否存在:-
如果
key
不存在,使用key
和value
创建一个新的节点,在双向链表的头部添加该节点,并将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 合并两个有序链表(简单):递归 2.2 删除排序链表中的重复元素(简单):一次遍历 2.3 两链表相加(中等):递归 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资源占用比(设置多个容器时才有效) 1.6.1 两个容器测试cpu 2&…...
通过请求头传数据向后端发请求
axios (get post请求、头部参数添加)傻瓜式入门axios_axiospost请求参数_web_blog的博客-CSDN博客...
产品流程图是什么?怎么做?
产品流程图是什么? 产品流程图是一种图形化的表达方式,用于描述产品开发、制造、销售、使用等各个阶段中涉及的流程、步骤和关系。它通过图形符号、箭头、文本等元素,展示了产品的各个环节之间的关联和顺序,通常被用于可视化产…...
面试之快速学习STL-map
关联式容器 包括 map、multimap、set 以及 multiset 这 4 种容器。和序列式容器区别: a . 关联式容器在存储元素时还会为每个元素在配备一个键,整体以键值对的方式存储到容器中。 b . 相比前者,关联式容器可以通过键值直接找到对应的元素&am…...
ES的索引结构与算法解析
提到ES,大多数爱好者想到的都是搜索引擎,但是明确一点,ES不等同于搜索引擎。不管是谷歌、百度、必应、搜狗为代表的自然语言处理(NLP)、爬虫、网页处理、大数据处理的全文搜索引擎,还是有明确搜索目的的搜索行为,如各大…...
32.Netty源码之服务端如何处理客户端新建连接
highlight: arduino-light 服务端如何处理客户端新建连接 Netty 服务端完全启动后,就可以对外工作了。接下来 Netty 服务端是如何处理客户端新建连接的呢? 主要分为四步: md Boss NioEventLoop 线程轮询客户端新连接 OP_ACCEPT 事件ÿ…...
代码随想录day11
20. 有效的括号 ● 力扣题目链接 ● 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串,判断字符串是否有效。 ● 有效字符串需满足: ● 左括号必须用相同类型的右括号闭合。 ● 左…...
RabbitMQ实习面试题
RabbitMQ实习面试题 在 RabbitMQ 中,确保生产者消息正确发布以及确保消费者已经消费是非常重要的任务。以下是一些方法和策略,可以帮助您在 RabbitMQ 中实现这些目标: 确保生产者消息正确发布: 持久化消息:将消息设…...
Electron入门,项目运行,只需四步轻松搞定。
electron 简单介绍: 实现:HTML/CSS/JS桌面程序,搭建跨平台桌面应用。 electron 官方文档: [https://electronjs.org/docs] 本文是基于以下2篇文章且自行实践过的,可行性真实有效。 文章1: https://www.cnbl…...
【C++】visualstudio环境安装
记录了部分安装步骤,可能有点不全,参考下,需要的磁盘空间差不多20GB; 下载 https://visualstudio.microsoft.com/zh-hans/vs/ 下载完成: 双击进入安装状态: 根据自己的需求勾选安装项: 选择…...
使用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中创建对象时,可以通过构造方法的参数来传递参数值。构造方法是一个特殊的方法,在创建对象时会自动调用,用于进行对象的初始化操作。 以下是一个示例代码,展示了如何在PHP中使用构造方法传递参数: class MyClass …...
C++并发及互斥保护示例
最近要写一个多线程的并发数据库,主要是希望使用读写锁实现库的并发访问,同时考虑到其他平台(如Iar)没有C的读写锁,需要操作系统提供,就将读写锁封装起来。整个过程还是比较曲折的,碰到了不少问题,在此就简…...
新手常犯的错误,anzo capital昂首资本一招避免少走弯路
新手是不是经常交易中赚不到钱,今天anzo capital昂首资本就盘点一下新手常犯的错误,一招教你少走弯路。 一.随便选择交易账户 开立实时账户时选择正确的账户类型,anzo capital昂首资本教你比较所有提供的账户类型,选择最符合财务…...
Java Vue (el-date-picker组件) 前后端 关于时间格式数据的处理方法
前端使用 elment-ui 组件 el-date-picker 其中组件需要格式化时间,增加属性 value-format"yyyy-MM-dd" 后端 Java 接收参数类型 后端Dto 使用Date接收,并添加JsonFormat注解 JsonFormat(pattern"yyyy-MM-dd") private Date testTi…...
Python爬虫——scrapy_多条管道下载
定义管道类(在pipelines.py里定义) 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(Ultimate Edition)时提示Lombok不生效 java: You aren’t using a compiler supported by lombok, so lombok will not work and has been disabled. 方式一:我们手动更新一下版本到以下版本 <!--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);//泛型委托的实例化,并关联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 - 如果且只要指定条件为真,就会循环遍历代码块。 do ... while - 循环执行一次代码块…...
思维进化算法(MEA)优化BP神经网络
随着计算机科学的发展,人们借助适者生存这一进化规则,将计算机科学和生物进化结合起来,逐渐发展形成一类启发式随机搜索算法,这类算法被称为进化算法(Evolutionary Com-putation, EC)。最著名的进化算法有:遗传算法、进化策略、进化规划。与传统算法相比,进化算法的特点是群体搜…...
Kotlin 中的 设计模式
单例模式 饿汉模式 饿汉模式在类初始化的时候就创建了对象,所以不存在线程安全问题。 局限性: 1、如果构造方法中有耗时操作的话,会导致这个类的加载比较慢; 2、饿汉模式一开始就创建实例,但是并没有调用…...
Vulnhub: ICMP: 1靶机
kali:192.168.111.111 靶机: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++修仙练气期总结)
分享自己最喜欢的一首歌:空想フォレスト—伊東歌詞太郎 机缘 现在想想自己在CSDN创作的原因,一开始其实就是想着拿着博客当做自己的学习笔记,笔记嘛,随便写写,自己看得懂就ok了的态度凸(艹皿艹 )。也是用来作为自己学习…...
css的常见伪元素使用
1.first-line 元素首行设置特殊样式。 效果演示: <div class"top"><p>可以使用 "first-line" 伪元素向文本的首行设置特殊样式。<br> 换行内容 </p></div> .top p::first-line {color: red;} 2.first-lette…...
91. 解码方法
递归法:超时了 从字符串的后面向前计算,每一次递归都缩小子集 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
引言: 虚拟机关闭后重新开启,理论上是需要重新启动一下docker的,以重新启动其中的服务。 命令基础: docker images:查看docker中现有的镜像 docker container ls -all:查看docker中目前在运行的containe…...
【校招VIP】java语言考点之ConcurrentHashMap1.7和1.8
考点介绍: ConcurrentHashMap是JAVA校招面试的热门考点,主要集中在1.7和1.8的底层结构和相关的性能提高。 理解这个考点要从map本身的并发问题出发,再到hashTable的低性能并发安全,引申到ConcurrentHashMap的分块处理。同时要理解…...
php如何实现5x+2x+1x=100
要实现5x 2x 1x 100的计算,可以使用PHP来解方程。以下是一个简单的PHP代码示例: php <?php $x 1; // 初始化x的值while (5*$x 2*$x 1*$x ! 100) { // 循环直到方程成立$x; // 每次循环增加x的值 }echo "x " . $x; // 输出x的值 ?…...
山海关网站制作/免费二级域名分发网站源码
2019独角兽企业重金招聘Python工程师标准>>> 今天做了个数据库的备份脚本,顺便系统得学习一下Linux下定时执行脚本的设置。Linux下的定时执行主要是使用crontab文件中加入定制计划来执行,设置比Windows稍微复杂一些(因为没有图形界面嘛)&…...
服务器ip做网站/企业网站建设的作用
为什么80%的码农都做不了架构师?>>> 通过为防火墙提供有关对来自某个源,到某个目的地或具有特定协议类型的信息包要执行操作的指令及规则控制信息包的过滤。通过使用Netfilter/iptables系统提供的特殊命令iptables建立这些规则,并…...
建站科技公司/如何做网络推广外包
今天在处理客户反馈的时候,客户发现了一个严重性的问题,发现在el-dialog中嵌套el-form,在el-from中有个邮单编码是用扫码枪录入的,需求明确指出可以录入多条邮单号。但是由于我们开发时没有用扫码枪测试该功能,后来客户发现&#…...
wordpress 群晖 局域网/杭州小周seo
CGGeometry参考定义几何结构和功能,操作简单。数据结构中的一个点CGPoint代表在一个二维坐标系统。数据结构的位置和尺寸CGRect代表的一个长方形。数据结构的尺寸CGSize代表宽度和高度。 1、创建一个几何原始数值 CGPoint CGPointMake(CGPoint A,CGPoint B&…...
网站怎么做漂亮点/关键词首页排名优化
int i;//定义int类型变量i; typedef int MyInit;//定义一种类型 MyInit j;//定义int类型变量j;下面介绍一些函数指针的使用形式一:返回类型 (*函数名) (参数表)#include<...>char (*pFun) (int); //定义一个参数类型为int 返回值为ch…...
为什么做网站推广/百度推广培训机构
sql语句中String类型数据一定需要加引号,浏览器的访问一定不能加引号,转载于:https://www.cnblogs.com/wth21-1314/p/9817318.html...