Open mangreen opened 4 years ago
趨勢
func maxInserts(S string) int {
countA, countOther := 0, 0
for i := 0; i < len(S); i++ {
if S[i] == 'a' {
countA++
} else {
countOther++
countA = 0
}
if countA == 3 {
return -1
}
}
// pairs of A's as separators and bookends for the non-a characters
return 2*(countOther+1) - (len(S) - countOther)
}
https://stackoverflow.com/questions/42786186/find-max-slice-of-array-javascript [1, 2, 3, 2] => [2, 3, 2] => ans: 3 [0, 5, 5, 4, 4, 5, 12] => [5, 5, 4, 4, 5] => ans: 5
func longestSubBiValuedArray(A []int) int {
count := 0
lp := 0
dict := []int{}
longest := 0
for i := 0; i < len(A); i++ {
if index(dict, A[i]) == -1 && len(dict) < 2 {
dict = append(dict, A[i])
lp = i
count++
} else if index(dict, A[i]) == -1 && len(dict) >= 2 {
dict = append(dict[1:], A[i])
count = i - lp + 1
} else if index(dict, A[i]) == 0 {
lp = i
count++
} else {
count++
}
longest = max(longest, count)
}
fmt.Println(dict, lp)
return longest
}
func index(dict []int, value int) int {
for pos, v := range dict {
if v == value {
return pos
}
}
return -1
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func longestSubBiValuedArray(A []int) int {
q := []obj{{A[0], 1}}
count := 1
longest := 1
for _, a := range A[1:] {
last := q[len(q)-1]
if len(q) < 2 || q[0].val == a || q[1].val == a {
count++
} else {
count = last.count + 1
}
if last.val == a {
q[len(q)-1].count++
} else {
q = append(q, obj{a, 1})
if len(q) > 2 {
q = q[1:]
}
}
if count > longest {
longest = count
}
}
return longest
}
type obj struct {
val int
count int
}
Given A, B, C, find any string of maximum length that can be created such that no 3 consecutive characters are same. There can be at max A 'a', B 'b' and C 'c'.
Example 1: Input: A = 1, B = 1, C = 6 Output: "ccbccacc"
Example 2: Input: A = 1, B = 2, C = 3 Output: "acbcbc"
Related questions: https://leetcode.com/problems/reorganize-string https://leetcode.com/problems/distant-barcodes https://leetcode.com/problems/rearrange-string-k-distance-apart (premium)
Ans: https://leetcode.com/problems/longest-happy-string/
給兩條sticks得到最大正方形的邊長 11, 13 => 5 1, 2 => 0 1, 8 => 2
func solution(A, B int) int {
if A+B < 4 {
return 0
}
l := (A + B) / 4
if B > A {
A, B = B, A
}
for l > 0 {
if A/2 >= l && B/2 >= l {
return l
}
if A/3 >= l && B >= l {
return l
}
if A/4 >= l {
return l
}
l--
}
return 0
}
func solution(N int, K int) int {
count := 0
for N > 1 {
if K > 0 {
if N%2 == 0 {
N /= 2
K--
} else {
N--
}
count++
} else {
count += N - 1
N = 0
}
}
return count
}
func solution(A []int) int {
n := len(A)
if n < 2 { // if no of elements are 2 then max groups are 2
return n
}
stack := []int{0} // stack to store the groups
for i := 1; i < n; i++ {
if A[i] >= A[i-1] {
stack = append(stack, i) // pushing elements if if ar[i] is greater than the previous element
}
for j := i; j > 0 && A[j] < A[j-1]; j-- { // finding the max number of grps
A[j], A[j-1] = A[j-1], A[j]
if j <= stack[len(stack)-1] {
stack = stack[:len(stack)-1]
}
}
}
return len(stack)
}
紙筆12題,1題SQL, 2題Node.js, 其他題目是GO
RUN 跟 START 差異 docker run 只在第一次運行時使用,將鏡像放到容器中,以後再次啟動這個容器時,只需要使用命令docker start 即可。 docker start的作用是,重新啟動已存在的鏡像。
COPY 跟 ADD 差異 https://blog.csdn.net/liukuan73/article/details/52936045 基本一樣但ADD多了 可以使用URL作為參數下載文件 並有能力自動解壓文件
https://skyyen999.gitbooks.io/-study-design-pattern-in-java/content/strategy.html https://juejin.im/post/6844903512317378568
Web HTTP 封包除錯技巧(Linux Server Tcpdump)
https://www.infoq.cn/article/3-simple-tricks-for-smaller-docker-images http://dockone.io/article/8163
&&
FROM ubuntu
RUN apt-get update && apt-get install vim
兩個 RUN
FROM ubuntu
RUN apt-get update
RUN apt-get install vim
FROM node:8 as build
WORKDIR /app
COPY package.json index.js ./
RUN npm install
FROM node:8
COPY --from=build /app /
EXPOSE 3000
CMD ["index.js"]
Docker自帶的一些命令還能協助壓縮鏡像,比如export和import
$ docker run -d test/test:0.2
$ docker export 747dc0e72d13 | docker import - test/test:0.3
如果在RUN命令中執行apt、apk或者yum類工具,可以借助這些工具提供的一些小技巧來減少鏡像層數量及鏡像大小。舉幾個例子:
(1)在執行apt-get install -y 時增加選項— no-install-recommends ,可以不用安裝建議性(非必須)的依賴,也可以在執行apk add 時添加選項--no-cache 達到同樣效果;
(2)執行yum install -y 時候, 可以同時安裝多個工具,比如yum install -y gcc gcc-c++ make …。將所有yum install 任務放在一條RUN命令上執行,從而減少鏡像層的數量;
(3)組件的安裝和清理要串聯在一條指令裡面,如 apk --update add php7 && rm -rf /var/cache/apk/ ,因為Dockerfile的每條指令都會產生一個文件層,如果將apk add … 和 rm -rf … 命令分開,清理無法減小apk命令產生的文件層的大小。 Ubuntu或Debian可以使用 rm -rf /var/lib/apt/lists/ 清理鏡像中緩存文件;CentOS等系統使用yum clean all 命令清理。
https://blog.wu-boy.com/2020/04/speed-up-docker-build-using-docker-buildkit/
https://blog.wu-boy.com/2019/02/using-cache-from-can-speed-up-your-docker-builds/
$ docker build --cache-from=gitea/gitea -t gitea/gitea .
https://learnku.com/server/t/42179 https://www.cnblogs.com/javazhiyin/p/12955024.html
https://ithelp.ithome.com.tw/articles/10194839 Docker 有提供 docker stats 指令讓使用者可以查看目前 Docker Container 所使用的 CPU、記憶體、網路I/O、BLOCK I/O …等等的資源使用量,讓使用者可以知道每個 Container 使用掉多少的系統資源。
先說最後一個,是Master/Slave,不是Slaver。這種方式基本上不再推薦使用,只能從Master復制數據到Slave,並不提供高可用,一旦Master結點出故障就比較難處理。具體細節就不說了,反正已經不推薦使用。
即常說的復制集。復制集的主要目標有幾個:
高可用(主要目標):當一個結點故障時自動切換到其他結點; 數據冗餘(主要目標):數據復制到n個結點上,增加數據安全性,同時為高可用提供基礎; 功能隔離(次要目標):使用不同的結點隔離某些有特殊需求的功能,比如使用一個結點進行OLAP運算(大規模資源佔用),使用一個結點在遠程做災備(性能要求不如本地高),讀寫分離等等;
即分片集。分片集的主要設計目標是:
水平擴展:當一台服務器滿足不了需求的時候,我們可以選擇垂直擴展(增加服務器硬件),它雖然簡單,但很容易達到極限,並且面臨成本高等明顯缺點。成本更低的方式是使用n台服務器組成集群來滿足系統需求。這就是分片集的主要設計目標; 縮短響應時間:因為可以把數據分散到多台服務器上,自然每台服務器的處理壓力減小,處理時間就會縮短; 這裡會出現一個問題:假設每台服務器出故障的機率是x%,那麼n台服務器有一台出現故障的機率就是x% * n,如果不做高可用設計,集群出現故障的概率就會隨機器數量成正比增長,這在工程上是不能接受的。幸運的是我們已經有瞭解決高可用的方案,也就是復制集。所以MongoDB的分片集群要求每一個片都是復制集(當然測試環境也可以使用單結點,生產環境不推薦)。
https://hackmd.io/@Rance