天天看點

ARTS打卡第八周

Algorithm: Leetcode 92. 反轉連結清單 II

反轉從位置 m 到 n 的連結清單。請使用一趟掃描完成反轉。

說明:

1 ≤ m ≤ n ≤ 連結清單長度。

示例:

輸入: 1->2->3->4->5->NULL, m = 2, n = 4

輸出: 1->4->3->2->5->NULL

解法一:頭插法,即找到開始反轉的前一個節點,以它作為臨時頭節點,後面的節點往它後面插。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;
        
        // 将p指向第 m-1 個節點
        ListNode p = dummyHead;
        for(int i=0; i<m-1; i++) {
            p = p.next;
        }
        
        // q 指向第 m 個節點,q不動,後面的節點都往它前面插
        ListNode q = p == null ? null : p.next;
        // r 指向 q 的後一個節點,也就是需要插到前面的節點
        ListNode r = q == null ? null : q.next;
        
        // 有 n-m 個節點需要移動
        int j = n - m;
        while(j > 0) {
            q.next = r.next;
            r.next = p.next;
            p.next = r;
            r = q.next;
            j--;
        }
        return dummyHead.next;
    }
}
           

解法二:反轉法,即将從第m個節點開始到第n個節點結束的這一段反轉之後再和前後的連結清單拼接起來。

總結:

隻周遊一遍反轉連結清單有兩種方式,一種是頭插法,即把後面的插到前面來;另一種是反向法,即把連結清單箭頭的指向挨個地反過來。這兩種方式都需要三個指針協同工作。

另外反向法也可以使用遞歸來解決。

Review: Virtual Reality Trends 2019

https://towardsdatascience.com/virtual-reality-trends-2019-64003e2667ef

2019年VR技術趨勢

  1. VR和AI增強:VR離不開AI
  2. 消費娛樂:VR遊戲,VR電視娛樂等。
  3. 教育和教育訓練:傳統教育和教育訓練的成本很高,利用VR進行教育和教育訓練,可以大幅縮減成本
  4. 旅遊:利用VR體驗旅遊。當你暈船時,戴上VR頭盔,你就置身于酒店的房間裡了。

Tip:如何批量删除docker中tag為的鏡像

我們在使用docker的過程中,經常會發現 docker images 列出的鏡像中有很多這樣的鏡像

REPOSITORY                                           TAG                 IMAGE ID            CREATED             SIZE
<none>                                               <none>              d1f6013eddfa        6 days ago          525MB
           

這些鏡像往往是由于建構過程出現錯誤異常終止而殘留下來的,如何能夠批量删除這種鏡像呢?可以使用如下指令:

docker rmi $(docker images -f 'dangling=true' -q)
           

其中,docker rmi 指令支援傳遞多個image作為參數批量删除;而docker images 指令支援使用 ‘dangling=true’ 這個filter來過濾出所有 tag 是 none的鏡像(-f 等同于 --filter,是添加過濾器的意思),docker images 的 -q 選項表示隻輸出鏡像ID。

docker images指令目前支援的filter有:

The currently supported filters are:

dangling (boolean - true or false)
label (label=<key> or label=<key>=<value>)
before (<image-name>[:<tag>], <image id> or <[email protected]>) - filter images created before given id or references
since (<image-name>[:<tag>], <image id> or <[email protected]>) - filter images created since given id or references
reference (pattern of an image reference) - filter images whose reference matches the specified pattern
           

關于 docker images filter 的用法,可以參考官方文檔:https://docs.docker.com/v17.12/engine/reference/commandline/images/#filtering

Share:影響了我二十年的三個原則

https://time.geekbang.org/column/article/104903

作者在文章中列出了三個原則,個人覺得這三個原則在職場中意義重大,是以分享出來。

一,閉環原則

說白了就是要及時回報,在項目靈活管理中也提倡要及時回報。回報,不僅能讓他人了解你的進度、遇到的困難,還能給你施加壓力,提高效率。本人剛入職時,其他一同入職的小夥伴每周都寫周報,彙報自己的學習情況,我的組長對我比較寬容,沒讓我寫,我剛開始還覺得很幸運,後來我漸漸發現,别人的周報裡都很充實,學了很多東西,反觀自己,好像沒什麼進展。直到有同僚離職,擔子落到自己頭上,才逼迫自己快速學習。

在做項目的時候也是,雖然我們規定兩周一疊代,但一個疊代的任務不能按時完成那是常态。直到後來有一個需求需要寫日報,那段日子感覺自己的效率提高不少,因為每天最痛苦的就是寫日報時沒東西可以,是以時刻提醒自己不要耽誤時間,正事要緊。

閉環原則也适用于個人的學習過程。有輸入也有輸出才能形成閉環。我們不僅要學習知識,還要有輸出,筆記、讀後感、代碼等都是可以輸出的東西,很少有人能夠做到知識學一遍就會,隻有不斷地輸入輸出,知識才會逐漸在腦海裡沉澱,這是一個反複了解和記憶的過程。

是以從現在起,我重拾自己的部落格和筆記,把學習當作一件非常正式的事情來做,而不是看看就算了。

二,誰難受誰推進原則

在工作中難免會遇到推诿扯皮的現象,這時應該誰來推進工作的進展呢?作者提出了“誰難受誰推進原則“,這為我們指明了一個方向。隻有事關生死,我們才會重視,是以如果一個項目如果對于我們來說非常重要,那麼我們就應當主動去推進這件事情。

三,Think bigger

在上一家公司,我的組長其實給了我很多非常有價值的東西,隻是我還沒有完全消化掉。其中有一點就是要有全局視野。在大公司裡,都說每個人就是一個螺絲釘,那正是因為缺了全局視野。拿到一個需求,我們不應該立馬去想代碼怎麼寫,那樣我們逃脫不了搬磚的命運。我們應當從更高的角度來看待這個需求,多問幾個為什麼:為什麼會有這個需求?這個需求和其他哪些需求是有關聯的?需求産生的背景是什麼樣的?涉及到哪些業務知識?這個需求最終實作的功能放到産品中是怎麼用的?什麼樣的客戶會來使用?等等。隻有多思考,透徹地了解了一個需求,才能在做代碼設計和實作的時候更加從容,作出更好的設計,寫出更好的代碼。這一點對于我來說,還有很長的路要走。

繼續閱讀