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

051、面试必刷TOP101--链表(230503)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 链表
    • 1、BM1 反转链表
    • 2、BM2 链表内指定区间反转
    • 3、BM3 链表中的节点每k个一组翻转
    • 4、BM4 合并两个排序的链表
    • 5、BM5 合并k个已排序的链表
    • 6、BM6 判断链表中是否有环
    • 7、BM7 链表中环的入口结点
    • 8、BM8 链表中倒数最后k个结点
    • 9、BM9 删除链表的倒数第n个节点
    • 10、BM10 两个链表的第一个公共结点
    • 11、BM11 链表相加(二)
    • 12、BM12 单链表的排序
    • 13、BM13 判断一个链表是否为回文结构
    • 14、BM14 链表的奇偶重排
    • 15、BM15 删除有序链表中重复的元素-I
    • 16、BM16 删除有序链表中重复的元素-II
  • 总结:


前言

提示:

本章节全部基于牛客网的题库中的在线编程,面试必刷TOP101:01-链表,总共十六道题目。


提示:以下是本篇文章正文内容,下面案例可供参考

链表


1、BM1 反转链表

题目描述:

给定一个单链表的头结点,长度为n,反转该链表后,返回新链表的表头。

  • 0≤n≤1000
  • 要求空间复杂度O(1)、时间复杂度O(1)

代码如下:

public class BM1 {/*** @param head : 给定一个链表的头节点* @return 返回反转链表后的新的头节点*/public ListNode ReverseList(ListNode head) {// base caseif (head == null || head.next == null) {return head;}// 利用指针(pre,记录之前遍历过的节点,cur为当前正在操作的节点,next保存原始链表顺序ListNode pre = null, cur = head, next = null;while (cur != null) {next = cur.next;cur.next = pre;pre = cur;cur = next;}return pre;}
}

总结:

其实,这道题很经典但是在设置指针的时候很容易出错,需要熟练使用指针。确保将一个指针记录之前操作过的链表节点,一个指针为正在操作的节点,一个指针保存原始链表顺序。


2、BM2 链表内指定区间反转

题目描述:

将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(N),空间复杂度O(1)。
给出的链表为 :1→2→3→4→5→NULL, m=2,n=4,
返回 :1→4→3→2→5→NULL.

代码实现:

public class BM2 {/*** @param head ListNode类* @param m    int整型* @param n    int整型* @return ListNode类*/public ListNode reverseBetween(ListNode head, int m, int n) {// write code here// 首先找到要开始翻转的节点 定义一个虚拟头节点ListNode fakeHead = new ListNode(0);fakeHead.next = head;int length = n - m + 1;// 记录需要反转的节点个数// 记录原始链表中,不需要被反转的的最后一个节点ListNode last = fakeHead, cur = head;while (m > 1) {cur = cur.next;last = last.next;m--;}// 此时的 cur 节点为需要反转的头节点 pre 为原始链表中不需要被翻转的最后一个节点// lastOne 记录被反转链表的头节点,也就是之后会成为尾节点ListNode pre = null, next = null, lastOne = cur;while (length > 0) {next = cur.next;cur.next = pre;pre = cur;cur = next;length--;}last.next = pre;lastOne.next = cur;return fakeHead.next;}
}

思路:

这道题开始有点晃到我了,但是仔细分析指针移动的原则,该记录就需要记录,细心一点。


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

题目描述:

将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表。如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样。你不能更改节点中的值,只能更改节点本身。
给定的链表是 1→2→3→4→5:

  • 对于 k=2 , 你应该返回 :2→1→4→3→5;
  • 对于 k=3 , 你应该返回 :3→2→1→4→5;

代码实现:

public class BM3 {/*** @param head ListNode类* @param k    int整型* @return ListNode类*/public ListNode reverseKGroup(ListNode head, int k) {// write code hereListNode dummy = new ListNode(0);dummy.next = head;ListNode last = dummy;// 已经翻转的链表的最后一个节点ListNode pre = null, cur = head, next = null;// 每次找到下次要翻转的节点(如果为空就不翻转)while (cur != null) {// 判断是否需要翻转本轮次ListNode hasNext = cur;for (int i = 1; i < k; i++) {hasNext = hasNext.next;if (hasNext == null) {return dummy.next;}}ListNode lastOne = cur;for (int i = 0; i < k; i++) {next = cur.next;cur.next = pre;pre = cur;cur = next;}last.next = pre;last = lastOne;lastOne.next = next;}return dummy.next;}
}

4、BM4 合并两个排序的链表

题目描述:

  • 输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
  • 如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6}。
  • 0≤n≤1000,−1000≤节点值≤1000

代码实现:

public class BM4 {/*** @param list1:链表头1* @param list2:链表头2* @return 返回新的头节点*/public ListNode Merge(ListNode list1, ListNode list2) {ListNode dummy = new ListNode(0);// 采用虚拟头节点// 采用双指针遍历ListNode p1 = list1, p2 = list2, cur = dummy;while (p1 != null && p2 != null) {if (p1.val <= p2.val) {cur.next = p1;p1 = p1.next;} else {cur.next = p2;p2 = p2.next;}cur = cur.next;}if (p1 != null) {cur.next = p1;}if (p2 != null) {cur.next = p2;}return dummy.next;}
}

5、BM5 合并k个已排序的链表

题目描述:

  • 合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。

代码实现:

public class BM5 {/*** 合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。** @param lists :一个包含k个升序链表头节点的arrayList* @return*/public ListNode mergeKLists(ArrayList<ListNode> lists) {ListNode dummy = new ListNode(0);// 虚拟头节点// 利用一个优先级队列PriorityQueue<ListNode> queue = new PriorityQueue<>((ListNode a, ListNode b) -> {return a.val - b.val;});// 利用指针ListNode cur = dummy;// 将arrayList中的头节点全部加入到优先级队列中for (ListNode listNode : lists) {if (listNode != null) {queue.add(listNode);}}// 遍历while (!queue.isEmpty()) {ListNode poll = queue.poll();cur.next = poll;if ((poll = poll.next) != null) {queue.add(poll);}cur = cur.next;}return dummy.next;}
}

6、BM6 判断链表中是否有环

题目描述:

  • 判断给定的链表中是否有环。如果有环则返回true,否则返回false。

代码实现:

public class BM6 {/*** 判断给定的链表中是否有环。如果有环则返回true,否则返回false。** @param head : 链表的头节点* @return 返回真就是有环,false无环*/public boolean hasCycle(ListNode head) {if (head == null || head.next == null) {return false;}// 利用快慢指针法则ListNode fast = head, slow = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;if (slow == fast) {return true;}}return false;}
}

7、BM7 链表中环的入口结点

题目描述:

  • 给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。

代码实现:

public class BM7 {public ListNode EntryNodeOfLoop(ListNode pHead) {// base caseif (pHead == null || pHead.next == null) {return null;}// 还是利用快慢指针ListNode fast = pHead, slow = pHead;while (fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;if (slow == fast) {fast = pHead;while (fast != slow) {fast = fast.next;slow = slow.next;}return slow;}}return null;}
}

8、BM8 链表中倒数最后k个结点

题目描述:

  • 输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。
  • 如果该链表长度小于k,请返回一个长度为 0 的链表。

代码实现:

public class BM8 {/*** @param pHead ListNode类* @param k     int整型* @return ListNode类*/public ListNode FindKthToTail(ListNode pHead, int k) {if (pHead == null) {return null;}// write code hereListNode dummy = new ListNode(0);dummy.next = pHead;ListNode slow = dummy, fast = dummy;while (k > 0) {fast = fast.next;k--;if (fast == null) {return null;}}while (fast != null) {fast = fast.next;slow = slow.next;}return slow;}
}

9、BM9 删除链表的倒数第n个节点

题目描述:

  • 给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针。

代码实现:

public class BM9 {/*** @param head ListNode类* @param n    int整型* @return ListNode类*/public ListNode removeNthFromEnd(ListNode head, int n) {// write code hereListNode dummy = new ListNode(0);dummy.next = head;// 虚拟头节点ListNode pre = dummy, cur = head, fast = head;while (n > 0) {fast = fast.next;n--;}while (fast != null) {fast = fast.next;cur = cur.next;pre = pre.next;}pre.next = cur.next;return dummy.next;}
}

10、BM10 两个链表的第一个公共结点

描述:

  • 输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。
  • (注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

代码实现:

public class BM10 {/*** @param pHead1* @param pHead2* @return 返回链表1和链表2的第一个公共节点*/public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {int length1 = getLength(pHead1);int length2 = getLength(pHead2);// 获取两个链表的长度差值int n = length1 >= length2 ? length1 - length2 : length2 - length1;// 长短链表ListNode longHead = length1 >= length2 ? pHead1 : pHead2;ListNode shortHead = longHead == pHead1 ? pHead2 : pHead1;// 让长的链表先走while (n > 0) {longHead = longHead.next;n--;}while (longHead != null && shortHead != null) {if (longHead == shortHead) {return longHead;}longHead = longHead.next;shortHead = shortHead.next;}return null;}// 得到链表的长度int getLength(ListNode head) {int size = 0;while (head != null) {size++;head = head.next;}return size;}
}

11、BM11 链表相加(二)

题目描述:

  • 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
  • 例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

看到的第一眼没思路:

  • 之后硬写,翻转后又翻转。。。。。

代码实现:

public class BM11 {/*** @param head1 ListNode类* @param head2 ListNode类* @return ListNode类*/public ListNode addInList(ListNode head1, ListNode head2) {// write code here// 翻转两个链表得到新的头节点ListNode reverseHead01 = reverse(head1);ListNode reverseHead02 = reverse(head2);// 新建链表int carry = 0, sum = 0;ListNode dummy = new ListNode(0);ListNode cur = dummy;while (reverseHead01 != null || reverseHead02 != null) {sum = 0;if (reverseHead01 != null) {sum += reverseHead01.val;reverseHead01 = reverseHead01.next;}if (reverseHead02 != null) {sum += reverseHead02.val;reverseHead01 = reverseHead02.next;}sum += carry;cur.next = new ListNode(sum % 10);cur = cur.next;carry = sum / 10;}if (carry == 1) {cur.next = new ListNode(1);}return reverse(dummy.next);}ListNode reverse(ListNode head) {ListNode pre = null, cur = head, next = null;while (cur != null) {next = cur.next;cur.next = pre;pre = cur;cur = next;}return pre;}}

12、BM12 单链表的排序

题目描述:

  • 给定一个节点数为n的无序单链表,对其按升序排序。

思路:

  • 这道题有点难,我不会,看了题解才做出来的。
  • 根据题目中的要求,空间复杂度为O(N),时间复杂度为O(NlogN),很容易联想到归并排序。
  • 将链表中的节点视为数组中的元素,申请一个和链表长度大小相等的数组空间,去存放链表中的元素。
  • 但是这种写法甚为暴力。

代码实现:

public class BM12 {/*** @param head ListNode类 the head node* @return ListNode类*/public ListNode sortInList(ListNode head) {// write code here// 获取链表的长度,申请一个大小为链表长度的数组空间,存放链表中的所有元素int size = getSize(head);ListNode[] nodes = new ListNode[size];ListNode cur = head;for (int i = 0; i < size; i++) {nodes[i] = cur;cur = cur.next;}mergeSort(nodes, 0, size - 1);for (int i = 0; i < size - 1; i++) {nodes[i].next = nodes[i + 1];}nodes[size - 1].next = null;return nodes[0];}void mergeSort(ListNode[] arr, int start, int end) {if (start < end) {int mid = start + (end - start) / 2;mergeSort(arr, start, mid);mergeSort(arr, mid + 1, end);merge(arr, start, mid, end);}}void merge(ListNode[] arr, int left, int mid, int right) {ListNode[] help = new ListNode[right - left + 1];int index = 0;int i = left, j = mid + 1;while (i <= mid && j <= right) {if (arr[i].val <= arr[j].val) {help[index++] = arr[i++];} else {help[index++] = arr[j++];}}while (i <= mid) {help[index++] = arr[i++];}while (j <= right) {help[index++] = arr[j++];}for (index = 0; index <= right - left; index++) {arr[left + index] = help[index];}}// 获取链表的长度int getSize(ListNode head) {int size = 0;while (head != null) {size++;head = head.next;}return size;}
}

但是其实因为是链表,所以可以使用快慢指针。

  • 如果要使用快慢指针的话,首先需要明白函数的递归含义。
  • 函数就是返回以head为头结点的初始链表,排序后的新的链表的头节点。
  • 将原始链表分为两段有序的链表,利用快慢指针,然后将两段分别有序的链表合并成一段有序的链表,并返回头节点。

代码实现:

    // 优美代码(拒绝暴力求解)// 返回以head为头节点的原始链表,排好序后的链表新的头节点public ListNode sortInListNice(ListNode head) {// write code here// base caseif (head == null || head.next == null) {return head;}// 利用快慢指针进行找到中间位置,将链表一分为二ListNode slow = head, fast = head.next;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}// 断掉(分成两段链表)ListNode rightHead = slow.next;slow.next = null;// 分别将两段链表进行排序ListNode left = sortInListNice(head);ListNode right = sortInListNice(rightHead);// 合并两个分别有序的链表return merge(left, right);}ListNode merge(ListNode left, ListNode right) {// 指针ListNode dummy = new ListNode(0);ListNode cur = dummy;while (left != null && right != null) {if (left.val <= right.val) {cur.next = left;left = left.next;} else {cur.next = right;right = right.next;}cur = cur.next;}if (left != null) {cur.next = left;}if (right != null) {cur.next = right;}return dummy.next;}

13、BM13 判断一个链表是否为回文结构

题目:

  • 给定一个链表,请判断该链表是否为回文结构。
  • 回文是指该字符串正序逆序完全一致。

思路:

  • 这道题我还是不会。
  • 无语,居然是用快慢指针,将链表一分为二后,翻转前半部分链表。
  • 行吧,开干

代码实现:

public class BM13 {/*** @param head ListNode类 the head* @return bool布尔型*/public boolean isPail(ListNode head) {// write code here// 利用快慢指针,将链表一分为二ListNode slow = head, fast = head.next;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}// 斩断链表的联系if (fast != null) {slow = slow.next;}fast = reverse(slow);slow = head;while (slow != null && fast != null) {if (slow.val != fast.val) {return false;}fast = fast.next;slow = slow.next;}return true;}// 翻转链表,返回头节点public ListNode reverse(ListNode head) {ListNode pre = null, cur = head, next = null;while (cur != null) {next = cur.next;cur.next = pre;pre = cur;cur = next;}return pre;}
}

14、BM14 链表的奇偶重排

题目:

  • 给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
  • 注意是节点的编号而非节点的数值。

代码实现:

public class BM14 {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** @param head ListNode类* @return ListNode类*/public ListNode oddEvenList(ListNode head) {// write code hereif (head == null || head.next == null) {return head;}//ListNode evenHead = head.next;ListNode odd = head, even = head.next;while (even != null && even.next != null) {odd.next = even.next;odd = odd.next;even.next = odd.next;even = even.next;}odd.next = evenHead;return head;}
}

15、BM15 删除有序链表中重复的元素-I

题目:

  • 删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次。

代码实现:

public class BM15 {/*** @param head ListNode类* @return ListNode类*/public ListNode deleteDuplicates(ListNode head) {// write code hereif (head == null || head.next == null) {return head;}ListNode pre = head, cur = head.next;while (cur != null) {while (cur != null && cur.val == pre.val) {cur = cur.next;}pre.next = cur;pre = cur;}return head;}
}

16、BM16 删除有序链表中重复的元素-II

题目:

  • 给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。

思路:

  • 还是不会,所以写一下思路。
  • 需要删除的是只要重复出现过的元素,采用递归去做。

代码实现:

public class BM16 {/*** @param head ListNode类* @return 返回原始链表,删除重复出现过的元素后的新的链表的头节点*/public ListNode deleteDuplicates(ListNode head) {// write code hereif (head == null) {return null;}// 如果当前链表头节点和后面一个节点元素相等if (head.next != null && head.val == head.next.val) {while (head.next != null && head.val == head.next.val) {head = head.next;}return deleteDuplicates(head.next);// 需要删除当前节点}head.next = deleteDuplicates(head.next);return head;}
}

总结:

写了一下链表章节的题目,对出现的十六道题目进行总结如下:

  1. 反转链表重点在于指针的使用,合理使用虚拟头节点;
  2. 指定区间内反转,还是指针的使用。先找到需要开始翻转链表的头节点,去这个链表中进行翻转。
  3. 每K个一组进行翻转,还是指针的使用,需要记录下一组反转的起始位置,这一组反转的位置。
  4. 合并两个排序数组,很简单。
  5. 合并K个升序链表,需要用到优先级队列。
  6. 判断链表是否有环,采用的是快慢指针。
  7. 找到环形链表的入环节点,还是快慢指针,先判断有环,相遇之后,再去找到入环节点。
  8. 链表的倒数最后K个结点,还是利用指针,一个先走然后再同时走。
  9. 删除链表的倒数第N个节点,还是采用的是关于指针先走后走。
  10. 两个链表的第一个公共节点, 先获取链表长度,让长的链表先走。
  11. 链表相加,需要用的链表反转相加后再去翻转。
  12. 单链表的排序,根据空间复杂度可以联想到归并排序,利用快慢指针,将一个链表分为两个有序的链表,然后合并两个有序的链表。
  13. 判断链表是否为回文结构,用的也是快慢指针,将链表的后半部分进行翻转后,再去判断是否为回文结构。
  14. 奇偶重排,还是利用指针;
  15. 删除有序链表的重复元素,使得链表中所有的元素都只出现一次,指针。
  16. 删除有序链表中所有重复的元素,使得链表中保留只出现一次的元素。这个很难,采用的是递归方法做的,判断当前节点元素和下一个节点元素是否相同。

相关文章:

051、面试必刷TOP101--链表(230503)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言链表1、BM1 反转链表2、BM2 链表内指定区间反转3、BM3 链表中的节点每k个一组翻转4、BM4 合并两个排序的链表5、BM5 合并k个已排序的链表6、BM6 判断链表中是否…...

开源中国面试准备

dockerFile常见命令 1、FROM 设置要制作的镜像基于哪个镜像&#xff0c;FROM指令必须是整个Dockerfile的第一个指令&#xff0c;如果指定的镜像不存在默认会自动从Docker Hub上下载 2、MAINTAINER 镜像作者的信息&#xff0c;比如名字或邮箱地址 语法&#xff1a;MAINTAINER n…...

基于J2EE的B2C电子商务系统开发与实现

摘要 当今社会,科学技术突飞猛进,知识经济初见端倪。电子商务作为一种新型的贸易方式,极大地促进了全球经济贸易的发展,同时也正在改变人们的生活方式和思想观念。电子商务是指整个贸易活动实现电子化,交易各方以电子交易方式而进行的商业交易。世界贸易组织电子商务专题报告定…...

三分钟教你看懂 spring 官方文档

新手如何学会查看官方文档API 首先进入官网&#xff1a;这里以 spring boot 为例 &#xff0c;进入spring 官方地址 我们进入 spring boot 这里我们要看文档当然是要 learn 了&#xff0c;所以点进去。 我需要的东西在 IO 模块里面&#xff0c;点 IO 进入 发送邮件是不是有了…...

基于simulink使用射频模块集天线块对天线阵列的射频系统进行建模

一、前言 本 例 说明 如何 对 包括 天线 阵列 的 MIMO 接收 和 发射 RF 系统 进行 建模。该设计从单个RF链的预算分析开始&#xff0c;然后扩展到多个天线。RF Blockset 天线模块对天线阵列进行全波分析&#xff0c;支持对效应和缺陷进行高保真建模&#xff0c;并结合射频系统的…...

从小学习编程的路线与编程进阶

对于从小学习编程的学生&#xff0c;通常会从基础的编程概念和语法开始学习。以下是一个可能的路线&#xff1a; 1. 学习计算机基础知识&#xff0c;包括计算机硬件、操作系统和网络等基本概念。 2. 掌握基本的编程概念和语法&#xff0c;例如变量、数据类型、条件语句和循环语…...

[实训] 实验1-SPI数据传输基础实验(上)

目 录​​​​​​​ 一、实验目的 二、实验仪器及器件 三、实验内容及原理 四、实验步骤​​​​​​​ 五、实验测试数据表格记录 六、实验数据分析及处理 七、实验结论与感悟 一、实验目的 使用FPGA/ARM实现SPI数据传输实验&#xff1b;实现数据传输程序的编写、下载…...

微软骚操作恶心Win10用户,上网得先看广告

IE 浏览器在几个月前被彻底禁用&#xff0c;预装了快30年的老古董也确实到了退役的时候。 而微软也早有准备&#xff0c;2015年随着 Win10 发布推出了 Microsoft Edge 浏览器。 2020年迁移到 Chromium 内核让其成为了主流浏览器之一。 和 Chromium 系其他浏览器一样支持扩展插…...

为了做低代码平台,这些年我们对.NET的DataGridView做的那些扩展

我们的低代码开发平台从一开始决定做的时候&#xff0c;就追求未来能够支持多种类型的客户端&#xff0c;目前支持Winform&#xff0c;Web&#xff0c;H5&#xff0c;FlutterAPP&#xff0c;当然了&#xff0c;未来也有可能会随着实际的需要淘汰掉一些客户端的。 为了系统更易…...

洛谷 子集积 题解

题目 P1 背包 子集积 > m >m >m 个数并不好求&#xff0c;考虑子集积 ≤ m \le m ≤m 的个数 x x x&#xff0c;答案即为 ( 2 n − x ) (2^n - x) (2n−x)。 对于子集积 ≤ m \le m ≤m 的个数&#xff0c;可以化为 0-1 背包问题做&#xff0c; f i , j f_{i,…...

Boost笔记 1:下载、编译、安装、测试

1. 下载 当前版本是1.82&#xff0c;下载链接&#xff1a; https://boostorg.jfrog.io/artifactory/main/release/1.82.0/source/ 2. 安装编译依赖库 本地环境是Ubuntu 22.04&#xff0c;需要安装以下依赖库&#xff0c;部分影响boost相关功能的开启&#xff0c;部分影响编译…...

tiechui_lesson01_入口函数和卸载函数

主要讲解入口函数和卸载函数。 #include <ntifs.h>VOID nothing(HANDLE ppid, HANDLE mypid, BOOLEAN bcreate) {UNREFERENCED_PARAMETER(ppid);UNREFERENCED_PARAMETER(mypid);UNREFERENCED_PARAMETER(bcreate);DbgPrint("processNotify\n"); }VOID DriverU…...

密码学【java】初探究加密方式之非对称加密

文章目录 非对称加密1 常见算法2 生成公钥和私钥3 私钥加密4 私钥加密 公钥解密5 公钥和私钥的保存和读取5.1 **保存公钥和私钥**5.2 读取公钥和私钥 非对称加密 非对称加密算法又称现代加密算法。非对称加密是计算机通信安全的基石&#xff0c;保证了加密数据不会被破解。与对…...

网络安全和黑客技能:15本必读书籍推荐

前言 网络安全和黑客技能紧密相连。想要有效地防范黑客攻击&#xff0c;了解黑客的技能和思维方式非常重要。而要想成为一名合格的白帽黑客&#xff0c;也需要深入理解网络安全的基本原理和最佳实践。本文将介绍15本网络安全和黑客书籍&#xff0c;既包括了防范黑客攻击的指南…...

电话号码的字母组合

题目&#xff1a;17. 电话号码的字母组合 - 力扣&#xff08;Leetcode&#xff09; 思路&#xff1a; 给定一个电话号码字符串 digits&#xff0c;须输出它所能表示的所有字母组合。我们可以先定义一个数字字符到字母表的映射表 numToStr&#xff0c;然后再用 Combine 函数递归…...

PAT A1032 Sharing

1032 Sharing 分数 25 作者 CHEN, Yue 单位 浙江大学 To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let the words share the same sublist if they share the same suffix. For example, l…...

Git常见问题汇总

问题&#xff1a;Your branch is ahead of ‘origin/master’ by 1 commit 原因&#xff1a;你的本地分支高于远程仓库一次提交, 同步更新下&#xff0c;执行命令&#xff1a; git push origin master问题&#xff1a;warning: LF will be replaced by CRLF in main.lua The …...

设计模式之代理模式(静态代理动态代理)

目录 1、什么是代理模式 2、代理模式的结构 3、代理模式的实现 3.1 静态代理和动态代理概念 3.2 静态代理 3.3 动态搭理 3.3.1 代码实现 3.3.2 Proxy类讲解 4、动态代理VS静态代理 5、代理模式优缺点 1、什么是代理模式 由于某些原因需要给某对象提供一个代理以控制对…...

Java并发编程基础知识概述

前言 在现代计算机系统和服务器中&#xff0c;多线程并行执行已经成为常态&#xff0c;而且并发编程能够充分利用系统资源&#xff0c;提高程序处理效率和质量。因此&#xff0c;Java并发编程是Java程序员必须掌握的重要技能之一。 线程和进程 在操作系统中&#xff0c;进程是…...

Redis超详细入门手册教程!还不快来看看?

地址&#xff1a; RedisRedis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. Redis provides data structures …https://redis.io/ 1&#xff1a;NoSQL简介 1.1&#xff1a;数据库应用的演变历程 单…...

代码随想录算法训练营第四十九天| 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

文章目录 121. 买卖股票的最佳时机122.买卖股票的最佳时机II 121. 买卖股票的最佳时机 为什么定义dp数组为二维数组&#xff1f; dp数组定义&#xff0c;dp(i)[0] 表示第i天持有股票所得最多现金&#xff0c;dp(i)[1]表示第i天不持有股票的状态&#xff08;未必当前卖出&#x…...

零基础如何学习挖漏洞?看这篇就够了【网络安全】

前言 有不少阅读过我文章的伙伴都知道&#xff0c;我从事网络安全行业已经好几年&#xff0c;积累了丰富的经验和技能。在这段时间里&#xff0c;我参与了多个实际项目的规划和实施&#xff0c;成功防范了各种网络攻击和漏洞利用&#xff0c;提高了安全防护水平。 也有很多小…...

Twitter 推荐算法底有多牛? 已斩获11.7K star

点击上方“Github中文社区”&#xff0c;关注 看Github&#xff0c;每天提升第070期分享 &#xff0c;作者&#xff1a;Huber | Github中文社区 大家好&#xff0c;我是Huber。 在美国当地时间 3 月 31 日&#xff0c;马斯克履行当初的诺言&#xff0c;他宣布了 Twitter 算法的…...

看过这篇文章,读懂数据分析

一、为什么需要数据分析 数据分析的重要性不言而喻&#xff0c;没有数据&#xff0c;就是感性。数据不会被观点打败&#xff0c;数据只能被数据打败。我们现在妥妥地已经进入了数据时代。 量化IT投资成效&#xff0c;以数据驱动决策 站在公司或者决策者角度&#xff0c;数据最…...

[计算机图形学]光场,颜色与感知(前瞻预习/复习回顾)

一、Light Field / Lumigraph—光场 1.我们看到的是什么 我们的眼睛能够把3D世界转换为2D的成像信号被我们感知&#xff0c;如上面第一幅图&#xff0c;这就是我们看到整个世界的过程&#xff0c;那么如果我们把之前记录的光的信息都完美的放在一个幕布上&#xff0c;那么我们…...

L4公司进军辅助驾驶,放话无图也能跑遍中国

作者 | Amy 编辑 | 德新 高阶智能驾驶走向规模量产&#xff0c;高精地图成为关键的门槛之一。今年&#xff0c;多家车企和智驾公司都喊出「不依赖高精地图&#xff0c;快速大规模落地」的口号。 华为、小鹏、元戎以及毫末等&#xff0c;可能是最快在国内量产 无高精图智…...

【Java笔试强训 17】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;杨辉三角…...

【IPv6】基本概念及字段

IPV4知识点&#xff1a; 字段值 IPv4字段共 字段值解释Version版本版本字段&#xff0c;可以区分V4和V6版本&#xff0c;V4是0100&#xff0c;V6是0110&#xff0c;需要注意的是V4和V6头部除了版本字段位置相同外&#xff0c;其他都是不一样的&#xff0c;因此两个协议不能直…...

数据库中的 Schema 变更实现

线上沙龙-技术流第 30 期营业啦 05月09日&#xff08;周二&#xff09;19:30 KaiwuDB - B站直播间 传统数据库操作 Schema 变更时&#xff0c;第一步便是锁表&#xff0c;需持续到 Schema 变更操作完成。这样的做法虽然实现简单&#xff0c;无需考虑事务并发带来的影响&#…...

【C++ 学习 ②】- 类和对象(上)

目录 一、 面向对象的基本理念 1.1 - 什么是对象&#xff1f; 1.2 - 类和对象 1.3 - 面向对象的五条原则 1.4 - 面向过程 vs 面向对象 二、C 中的结构体 三、类的定义 3.1 - 类的两种定义方式 3.2 - 成员变量的命名规范 四、类的访问限定符和封装 4.1 - 访问限定符 …...

网站建设基础策划/百度快照推广是什么意思

5. Spring框架中的新功能和增强功能 III sunRainAmazing 5.1核心容器改造 1、诸如Bean使用Java 8默认方法检测和处理的注释&#xff0c;允许使用默认Bean方法从接口组态配置类。 2、配置类可以Import使用常规组件类声明&#xff0c;允许混合导入的配置类和组件类。 3、配置类…...

网站算阵地建设/百度关键词屏蔽

主要分以下步骤&#xff1a; 1&#xff09;关闭sendmail 2)用yum安装bind-*即DNS的配置 3&#xff09;yum安装postfix,配置其主配置文件/etc/postfix/main.cf 4&#xff09;安装cyrus-sasl,配置/etc/sysconfig/saslauthd 5)安装dovecot并进行配置 6&#xff09;安装cyrus-imapd…...

视频弹幕网站建设/百度平台客服

给大家炒个冷饭&#xff0c;是我在2003年写的一点心得。不过现在来看还是有启发意义的&#xff0c;虽然笔法有些稚嫩 实施分为这几个阶段&#xff1a;1字典准备&#xff0c;系统参数配置2客户化3使用培训4做报表做运行监控5升级更新版本这几部分都挺费时间。为什么&#xff1f…...

北京做网站s/深圳网站优化排名

代码实现报表打印 //初始化报表信息 private void SetReportInfo(string reportPath,string sourceName,DataTable dataSource,bool isFengPi) {if (!File.Exists(reportPath)) { MessageBox.Show("报表文件:" reportPath " 不存在!","提示&…...

网站建设与搜索/广告推销

为什么80%的码农都做不了架构师&#xff1f;>>> <?xml version"1.0" encoding"UTF-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/empty_cart_view"android:…...

商业网站开发的实训小结怎么写/微信社群营销推广方案

选中项目&#xff0c;右键--->Properties--->在搜索框搜索&#xff1a;deployment as 然后点击显示出的搜索项。修改右侧视图的Web Context Root名称即可。 如图&#xff1a; 转载于:https://www.cnblogs.com/lyhbky/p/10695143.html...