• 双非二本找实习前的准备day3


    学习目标:

    每天2-3到简单sql(刷完即止),每天复习代码随想录上的题目3道算法(时间充足可以继续),背诵的八股的问题也在这里记录了

    今日碎碎念:

    1)偶尔还是贪玩游戏,但是进度有在往前,八股计划准备这些,计网,JVM,JUC,Java基础与集合,MySQL,Redis,Spring和Spring Boot,整体下来,热门的能准备到70%就开投。

    2)明天是MySQL和Redis的八股部分。

    3)哎还有科三科四没考,只能约到3月15号的,刚好一边准备面试。

    4)项目还得优化一两道,简历还会再修改几次。


    力扣刷题

    SQL

    力扣1789:1789. 员工的直属部门

    解答思路:

            1)这道题很有意思啊,我觉得也是练习分组和子查询很好的一道题,咱看注释就好了

    1. # 值得注意的就是题目中提到的如果只加了一个部门,虽然primary_flag是N但是也是直属部门
    2. # 也就是说,当count(department_id) = 1 的时候表示是直属部门
    3. # 因此需要先找到primary_id为Y的
    4. # 然后按照员工id分组,我们得查出哪些只加入了一个部门的员工,很明显这是一个子查询
    5. select employee_id,department_id
    6. from Employee
    7. where
    8. primary_flag = 'Y'
    9. or
    10. employee_id in (
    11. select employee_id
    12. from Employee
    13. group by employee_id
    14. having count(department_id) = 1
    15. )

    力扣607:607. 销售员

    解答思路:

            1)本道题别给那么多张表吓到就好了,其实理清楚思路就行,反推着写

            2)要找没有向RED公司销售过的员工名字,就得先找到员工ID

            3)要找到符合的员工ID,就得先找到在Orders表里面的和RED的ID有关的员工ID

            4)要找到Orders表里面的和RED的ID,就得先对着RED这个公司名字去找ID

    1. # 多表查询,要求我们查出没有向RED公司销售过的员工名字
    2. # 因此得先解决如何查询到向RED公司销售过的员工的名字,我这里命名为结果集A
    3. # 但是再大前提就是,得先找到RED的com_id是什么
    4. # 然后拿着SalesPerson表中的sales_id来判别即可,即不在结果集A中的就是答案
    5. select SalesPerson.name
    6. from SalesPerson
    7. where SalesPerson.sales_id not in(
    8. select sales_id
    9. from Orders
    10. where com_id = (
    11. select Company.com_id
    12. from Company
    13. where Company.name = 'RED'
    14. )
    15. )

    算法

    力扣707:707. 设计链表

    解答思路:

            1)看注释即可

    1. class MyLinkedList {
    2. class ListNode{
    3. int val;
    4. ListNode next;
    5. ListNode(){};
    6. ListNode(int val){
    7. this.val = val;
    8. }
    9. }
    10. //记录元素个数
    11. int size;
    12. //虚拟头节点
    13. ListNode head;
    14. //初始化链表
    15. public MyLinkedList() {
    16. size = 0;
    17. head = new ListNode(0);
    18. }
    19. public int get(int index) {
    20. //如果下标无效就返回-1
    21. if(index >= size || index < 0){
    22. return -1;
    23. }
    24. //查找指定下标的元素
    25. ListNode tmp = head;
    26. //因为是获取下标的元素,超过下标后的无需再查找了
    27. //等于是因为我们有虚拟头节点
    28. for(int i = 0 ; i <= index ; i++){
    29. tmp = tmp.next;
    30. }
    31. return tmp.val;
    32. }
    33. //头插法
    34. public void addAtHead(int val) {
    35. //调用addAtIndex
    36. addAtIndex(0,val);
    37. }
    38. //尾插法
    39. public void addAtTail(int val) {
    40. //调用addAtIndex
    41. addAtIndex(size,val);
    42. }
    43. //在这里实现头插,尾插,普通插入
    44. public void addAtIndex(int index, int val) {
    45. //过滤不符合位置的下标
    46. if(index > size){
    47. return;
    48. }
    49. //index小于0
    50. if(index<0){
    51. index = 0;
    52. }
    53. //插入后,数量增加
    54. size++;
    55. //我们通过前驱节点来插入元素(利用虚拟头节点)
    56. ListNode pre = this.head;
    57. //找到指定位置
    58. for(int i = 0;i < index;i++){
    59. pre = pre.next;
    60. }
    61. //new新节点
    62. ListNode newNode = new ListNode(val);
    63. //插入节点就是将原来的节点往后移
    64. newNode.next = pre.next;
    65. pre.next = newNode;
    66. }
    67. public void deleteAtIndex(int index) {
    68. //过滤无效下标
    69. if (index < 0 || index >= size) {
    70. return;
    71. }
    72. //数量1
    73. size--;
    74. if (index == 0) {
    75. head = head.next;
    76. return;
    77. }
    78. //移动到指定位置
    79. ListNode pre = head;
    80. for(int i = 0; i < index ; i++){
    81. pre = pre.next;
    82. }
    83. pre.next = pre.next.next;
    84. }
    85. }
    86. /**
    87. * Your MyLinkedList object will be instantiated and called as such:
    88. * MyLinkedList obj = new MyLinkedList();
    89. * int param_1 = obj.get(index);
    90. * obj.addAtHead(val);
    91. * obj.addAtTail(val);
    92. * obj.addAtIndex(index,val);
    93. * obj.deleteAtIndex(index);
    94. */

    力扣206:206. 反转链表

    解答思路:

            双指针做法

            1)我自己在做这些链表题目的时候,都会画图(脑子里也可以),画图之后就不一定会那么抽象了,我个人感觉,链表题目的核心的就是,搞清楚指向问题,即搞清楚当前节点的下一个节点,前一个节点,到底是什么内容,我们需要将这两个节点变成啥才能达到我们想要的结果

    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode() {}
    7. * ListNode(int val) { this.val = val; }
    8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    9. * }
    10. */
    11. class Solution {
    12. public ListNode reverseList(ListNode head) {
    13. //这里通过双指针来实现
    14. ListNode pre = null;
    15. ListNode cur = head;
    16. //涉及到交换,这里得再定义中间变量
    17. ListNode tmp = null;
    18. //从原链表来获取节点,拼接到新头节点上
    19. while(cur != null){
    20. //保存下一个节点
    21. tmp = cur.next;
    22. cur.next = pre;
    23. //移动指针
    24. pre = cur;
    25. cur = tmp;
    26. }
    27. return pre;
    28. }
    29. }

    递归做法
    1. // 递归
    2. class Solution {
    3. public ListNode reverseList(ListNode head) {
    4. return reverse(null, head);
    5. }
    6. private ListNode reverse(ListNode prev, ListNode cur) {
    7. if (cur == null) {
    8. return prev;
    9. }
    10. ListNode temp = null;
    11. temp = cur.next;// 先保存下一个节点
    12. cur.next = prev;// 反转
    13. // 更新prev、cur位置
    14. // prev = cur;
    15. // cur = temp;
    16. return reverse(cur, temp);
    17. }
    18. }

    力扣24:24. 两两交换链表中的节点

    解答思路:

            1)这道题跟反转链表其实也是一样的思路,推荐画出来做,做这种交换的题目你就这样想:

    给你一个空瓶子,一瓶雪碧,一瓶可乐,要你把雪碧放到可乐瓶子里面,可乐放到雪碧瓶子里面去,那么肯定是将其中一个倒到空瓶子中先才可以

    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode() {}
    7. * ListNode(int val) { this.val = val; }
    8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    9. * }
    10. */
    11. class Solution {
    12. //不太擅长写递归,所以使用虚拟头节点 + 迭代来做
    13. public ListNode swapPairs(ListNode head) {
    14. ListNode dum = new ListNode(-1);
    15. dum.next = head;
    16. ListNode cur = dum;
    17. ListNode tmp = null;
    18. ListNode firstNode = null;
    19. ListNode secondNode = null;
    20. //要交换必须要保证有两个节点
    21. while(cur.next != null && cur.next.next != null){
    22. //先记录第三个节点
    23. tmp = cur.next.next.next;
    24. //记录第一个节点
    25. firstNode = cur.next;
    26. //记录第二个节点
    27. secondNode = cur.next.next;
    28. //交换
    29. cur.next = secondNode;
    30. secondNode.next = firstNode;
    31. firstNode.next = tmp;
    32. //指针移动
    33. cur = firstNode;
    34. }
    35. return dum.next;
    36. }
    37. }

    八股

    计算机网络

    TCP

    1.TCP三次握手和四次挥手
    2.TCP 如何保证传输的可靠性?
    3.TCP和UDP的区别
    4.TCP的三次握手中为什么是三次?为什么不是两次?四次?
    5.TCP的四次挥手中为什么是四次?为什么不是三次?
    6.TCP的拥塞控制是怎么实现的?
    7.TCP流量控制和拥塞控制的区别
    8.TCP如何实现流量控制

    HTTP

    1.常见状态码
    2.从输入URL到页面展示到底发生了什么
    3.GET和POST的区别是什么
    4.HTTP和HTTPS有什么区别
    5.Cookie和Session有什么区别
  • 相关阅读:
    Promise 解决 Vue 中父子组件的加载问题!
    RHCE8练习题
    Nginx 通过userAgent判断是否时搜索引擎蜘蛛
    开源相机管理库Aravis例程学习(一)——单帧采集single-acquisition
    JumpServer未授权访问漏洞 CVE-2023-42442
    【斗破年番】彩鳞换装美翻,雁落天惨死,萧炎暗杀慕兰三老遇险,彩鳞霸气护夫
    香港科技大学广州|智能制造学域&机器人与自主系统学域博士招生宣讲会—中国科学技术大学专场
    计算机毕业设计 SSM超市收银管理系统 便利店收银管理系统 酒吧收银管理系统 酒店收银系统Java Vue MySQL数据库 远程调试 代码讲解
    山东2024年高企申报条件
    前端自学需要把大量时间放在 HTML、CSS 吗?
  • 原文地址:https://blog.csdn.net/m0_61724447/article/details/136377301