網(wǎng)站建設(shè)買(mǎi)了服務(wù)器后怎么做口碑優(yōu)化seo
學(xué)習(xí)目標(biāo):
每天2-3到簡(jiǎn)單sql(刷完即止),每天復(fù)習(xí)代碼隨想錄上的題目3道算法(時(shí)間充足可以繼續(xù)),背誦的八股的問(wèn)題也在這里記錄了
今日碎碎念:
1)偶爾還是貪玩游戲,但是進(jìn)度有在往前,八股計(jì)劃準(zhǔn)備這些,計(jì)網(wǎng),JVM,JUC,Java基礎(chǔ)與集合,MySQL,Redis,Spring和Spring Boot,整體下來(lái),熱門(mén)的能準(zhǔn)備到70%就開(kāi)投。
2)明天是MySQL和Redis的八股部分。
3)哎還有科三科四沒(méi)考,只能約到3月15號(hào)的,剛好一邊準(zhǔn)備面試。
4)項(xiàng)目還得優(yōu)化一兩道,簡(jiǎn)歷還會(huì)再修改幾次。
力扣刷題
SQL
力扣1789:1789. 員工的直屬部門(mén)
解答思路:
? ? ? ? 1)這道題很有意思啊,我覺(jué)得也是練習(xí)分組和子查詢(xún)很好的一道題,咱看注釋就好了
# 值得注意的就是題目中提到的如果只加了一個(gè)部門(mén),雖然primary_flag是N但是也是直屬部門(mén)
# 也就是說(shuō),當(dāng)count(department_id) = 1 的時(shí)候表示是直屬部門(mén)
# 因此需要先找到primary_id為Y的
# 然后按照員工id分組,我們得查出哪些只加入了一個(gè)部門(mén)的員工,很明顯這是一個(gè)子查詢(xún)select employee_id,department_idfrom Employeewhere primary_flag = 'Y'oremployee_id in (select employee_idfrom Employeegroup by employee_idhaving count(department_id) = 1)
力扣607:607. 銷(xiāo)售員
解答思路:
? ? ? ? 1)本道題別給那么多張表嚇到就好了,其實(shí)理清楚思路就行,反推著寫(xiě)
? ? ? ? 2)要找沒(méi)有向RED公司銷(xiāo)售過(guò)的員工名字,就得先找到員工ID
? ? ? ? 3)要找到符合的員工ID,就得先找到在Orders表里面的和RED的ID有關(guān)的員工ID
? ? ? ? 4)要找到Orders表里面的和RED的ID,就得先對(duì)著RED這個(gè)公司名字去找ID
# 多表查詢(xún),要求我們查出沒(méi)有向RED公司銷(xiāo)售過(guò)的員工名字
# 因此得先解決如何查詢(xún)到向RED公司銷(xiāo)售過(guò)的員工的名字,我這里命名為結(jié)果集A
# 但是再大前提就是,得先找到RED的com_id是什么
# 然后拿著SalesPerson表中的sales_id來(lái)判別即可,即不在結(jié)果集A中的就是答案
select SalesPerson.namefrom SalesPersonwhere SalesPerson.sales_id not in(select sales_idfrom Orderswhere com_id = (select Company.com_idfrom Companywhere Company.name = 'RED'))
算法
力扣707:707. 設(shè)計(jì)鏈表
解答思路:
? ? ? ? 1)看注釋即可
class MyLinkedList {class ListNode{int val;ListNode next;ListNode(){};ListNode(int val){this.val = val;}}//記錄元素個(gè)數(shù)int size;//虛擬頭節(jié)點(diǎn)ListNode head;//初始化鏈表public MyLinkedList() {size = 0;head = new ListNode(0);}public int get(int index) {//如果下標(biāo)無(wú)效就返回-1if(index >= size || index < 0){return -1;}//查找指定下標(biāo)的元素ListNode tmp = head;//因?yàn)槭谦@取下標(biāo)的元素,超過(guò)下標(biāo)后的無(wú)需再查找了//等于是因?yàn)槲覀冇刑摂M頭節(jié)點(diǎn)for(int i = 0 ; i <= index ; i++){tmp = tmp.next;}return tmp.val;}//頭插法public void addAtHead(int val) {//調(diào)用addAtIndexaddAtIndex(0,val);}//尾插法public void addAtTail(int val) {//調(diào)用addAtIndexaddAtIndex(size,val);}//在這里實(shí)現(xiàn)頭插,尾插,普通插入public void addAtIndex(int index, int val) {//過(guò)濾不符合位置的下標(biāo)if(index > size){return;}//index小于0if(index<0){index = 0;}//插入后,數(shù)量增加size++;//我們通過(guò)前驅(qū)節(jié)點(diǎn)來(lái)插入元素(利用虛擬頭節(jié)點(diǎn))ListNode pre = this.head;//找到指定位置for(int i = 0;i < index;i++){pre = pre.next;}//new新節(jié)點(diǎn)ListNode newNode = new ListNode(val);//插入節(jié)點(diǎn)就是將原來(lái)的節(jié)點(diǎn)往后移newNode.next = pre.next;pre.next = newNode;}public void deleteAtIndex(int index) {//過(guò)濾無(wú)效下標(biāo)if (index < 0 || index >= size) {return;}//數(shù)量1size--;if (index == 0) {head = head.next;return;}//移動(dòng)到指定位置ListNode pre = head;for(int i = 0; i < index ; i++){pre = pre.next;}pre.next = pre.next.next;}
}/*** Your MyLinkedList object will be instantiated and called as such:* MyLinkedList obj = new MyLinkedList();* int param_1 = obj.get(index);* obj.addAtHead(val);* obj.addAtTail(val);* obj.addAtIndex(index,val);* obj.deleteAtIndex(index);*/
力扣206:206. 反轉(zhuǎn)鏈表
解答思路:
? ? ? ? 雙指針做法
? ? ? ? 1)我自己在做這些鏈表題目的時(shí)候,都會(huì)畫(huà)圖(腦子里也可以),畫(huà)圖之后就不一定會(huì)那么抽象了,我個(gè)人感覺(jué),鏈表題目的核心的就是,搞清楚指向問(wèn)題,即搞清楚當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),前一個(gè)節(jié)點(diǎn),到底是什么內(nèi)容,我們需要將這兩個(gè)節(jié)點(diǎn)變成啥才能達(dá)到我們想要的結(jié)果
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseList(ListNode head) {//這里通過(guò)雙指針來(lái)實(shí)現(xiàn)ListNode pre = null;ListNode cur = head;//涉及到交換,這里得再定義中間變量ListNode tmp = null;//從原鏈表來(lái)獲取節(jié)點(diǎn),拼接到新頭節(jié)點(diǎn)上while(cur != null){//保存下一個(gè)節(jié)點(diǎn)tmp = cur.next;cur.next = pre;//移動(dòng)指針pre = cur;cur = tmp;}return pre;}
}
遞歸做法
// 遞歸
class Solution {public ListNode reverseList(ListNode head) {return reverse(null, head);}private ListNode reverse(ListNode prev, ListNode cur) {if (cur == null) {return prev;}ListNode temp = null;temp = cur.next;// 先保存下一個(gè)節(jié)點(diǎn)cur.next = prev;// 反轉(zhuǎn)// 更新prev、cur位置// prev = cur;// cur = temp;return reverse(cur, temp);}
}
力扣24:24. 兩兩交換鏈表中的節(jié)點(diǎn)
解答思路:
? ? ? ? 1)這道題跟反轉(zhuǎn)鏈表其實(shí)也是一樣的思路,推薦畫(huà)出來(lái)做,做這種交換的題目你就這樣想:
給你一個(gè)空瓶子,一瓶雪碧,一瓶可樂(lè),要你把雪碧放到可樂(lè)瓶子里面,可樂(lè)放到雪碧瓶子里面去,那么肯定是將其中一個(gè)倒到空瓶子中先才可以
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {//不太擅長(zhǎng)寫(xiě)遞歸,所以使用虛擬頭節(jié)點(diǎn) + 迭代來(lái)做public ListNode swapPairs(ListNode head) {ListNode dum = new ListNode(-1);dum.next = head;ListNode cur = dum;ListNode tmp = null;ListNode firstNode = null;ListNode secondNode = null;//要交換必須要保證有兩個(gè)節(jié)點(diǎn)while(cur.next != null && cur.next.next != null){//先記錄第三個(gè)節(jié)點(diǎn)tmp = cur.next.next.next;//記錄第一個(gè)節(jié)點(diǎn)firstNode = cur.next;//記錄第二個(gè)節(jié)點(diǎn)secondNode = cur.next.next;//交換cur.next = secondNode;secondNode.next = firstNode;firstNode.next = tmp;//指針移動(dòng)cur = firstNode;}return dum.next;}
}