ARTS開啟第九周

2021-09-25 02:14:53 字數 3021 閱讀 4051

algorithm:leetcode 234. 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。

示例 1:

輸入: 1->2

輸出: false

示例 2:

輸入: 1->2->2->1

輸出: true

高階:你能否用 o(n) 時間複雜度和 o(1) 空間複雜度解決此題?

解法一:先遍歷一遍,將原鍊錶全部反轉得到乙個新鍊錶;再遍歷一遍,將新舊兩個鍊錶逐個比較。時間複雜度和空間複雜度都是o(n)。

解法二:先遍歷一遍求出鍊錶長度,計算出鍊錶中間節點的位置。然後遍歷前半段,將其反轉。繼續遍歷後半段,將其與反轉後的前半段鍊錶逐個比較。時間複雜度是o(n),空間複雜度是o(1)。

解法二優化:用快慢指標尋找中間節點,反轉後半段而不是前半段,因為反轉前半段還得關心鍊錶長度是奇數還是偶數。

/**

* definition for singly-linked list.

* public class listnode

* }*/class solution

return leftstart == slow;

}private listnode reverseoriginallist(listnode head)

return p;

}// 解法二:先遍歷一遍求出鍊錶長度,計算出鍊錶中間節點的位置。然後遍歷前半段,將其反轉。繼續遍歷後半段,將其與反轉後的前半段鍊錶逐個比較。

private boolean ispalindromesolution_2(listnode head)

// reverse the left half o(n/2)

int half = size / 2;

int i = 0;

p = null;

listnode q = head;

listnode r = head == null ? null : head.next;

while(i++ < half)

// compare o(n/2)

listnode leftstart = p;

listnode rightstart = size % 2 == 0 ? q : r;

while(leftstart != null && leftstart.val == rightstart.val)

return leftstart == null;

// total o(n) 空間複雜度o(1)

}// 解法一:將輸入反轉得到乙個新的鍊錶,逐個比較。時間和空間複雜度都是o(n)

private boolean ispalindromesolution_1(listnode head)

return head == null;

}private listnode reversenewlist(listnode head)

return p;

}private void print(listnode head)

system.out.println(sb.tostring());

}}

舉個例子,想在本地寫乙個指令碼,執行一下就可以刪除遠端伺服器上的所有tag等於的docker 映象:

#!/bin/bash

set -e

ssh_ip=xx.xx.xx.xx

ssh_port=yy

ssh root@$ -p $ ' docker rmi $(docker images -f "dangling=true" -q) '

在這個指令碼裡,我們使用單引號括起了乙個command,作為ssh遠端執行的命令。這個command裡使用$()開啟乙個新的shell執行乙個子命令,將執行完的結果傳給 docker rmi 命令。

如果我們用單引號括起command,command裡的變數不會被解析,只會作為普通字串傳遞到遠端機器上,然後在遠端機器上被解析,也就是這裡的docker images命令和docker rmi命令都是在遠端機器上執行的;

如果我們用雙引號括起command,command裡的變數會先在本地被解析,然後將解析後的結果作為command的一部分傳到遠端機器上,也就是docker images命令會在本地執行,而docker rmi命令在遠端執行。

不注意上述區別的話,我們的指令碼就會不work。

另外,如果想要在雙引號括起來的command裡的變數不在本地解析,也可以在變數前加轉義符 \ ,就像這樣:

ssh root@$ -p $ 「 docker rmi \$(docker images -f 』dangling=true『 -q) 」
注意,如果引號裡面又有引號,需要單雙引號巢狀使用。

參考資料:

閱讀原文

分治,不要將複雜邏輯寫在乙個類裡

最好是什麼工具都不要用,次之是用乙個極簡的pipeline模式,最差是使用像流程引擎這樣的重方法

在做過程分解的時候,我建議工程師不要把太多精力放在工具上,放在設計模式帶來的靈活性上。而是應該多花時間在對問題分析,結構化分解,最後通過合理的抽象,形成合適的階段(phase)和步驟(step)上

通過物件的多型可以消除我們**中的大部分的if-else

有過程分解要好於沒有分解,過程分解+物件模型要好於僅僅是過程分解

自上而下的結構化分解+自下而上的物件導向分析。

指導下沉有兩個關鍵指標:復用性、內聚性

復用性是告訴我們when(什麼時候該下沉了),即有重複**的時候。內聚性是告訴我們how(要下沉到**),功能有沒有內聚到恰當的實體上,有沒有放到合適的層次上(因為domain層的能力也是有兩個層次的,乙個是domain service這是相對比較粗的粒度,另乙個是domain的model這個是最細粒度的復用)。

不管是業務技術還是底層技術人員,有一些思維和能力都是共通的。比如,分解問題的能力,抽象思維,結構化思維等等。

「做不好業務開發的,也做不好技術底層開發,反之亦然。業務開發一點都不簡單,只是我們很多人把它做「簡單」了

第九周 工資

設計乙個工資類 salary 其中的資料成員包括職工人數 number,人數不定 和number個職工的工資salary,要求輸入職工工資並逐個輸出。class salary 下面定義類的成員函式 下面是測試函式 int main 答案 includeusing namespace std clas...

第九周總結

二 從 activitythread main 到 activity oncreate handler 訊息機制 handler 訊息機制除了 handler 本身外,還包含 looper messagequeue message,訊息機制需要有訊息佇列 訊息迴圈 訊息處理 如下 handler 傳...

第九周作業

1 編寫指令碼,接受二個位置引數,magedu和 www,判斷系統是否有magedu,如果沒有則自動建立magedu使用者,並自動設定家目錄為 www vim create user.sh bin bash if ne 2 then echo 0 username directory exit 1 ...