当前位置:   article > 正文

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

双非二本找实习前的准备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有什么区别
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/397842
推荐阅读
相关标签
  

闽ICP备14008679号