mangreen / Some-Note

Development Memo
1 stars 0 forks source link

interview #24

Open mangreen opened 4 years ago

mangreen commented 4 years ago

https://hackmd.io/@Rance

mangreen commented 4 years ago

趨勢

1. https://leetcode.com/discuss/interview-question/398056/Microsoft-or-OA-2019-or-Max-Inserts-to-Obtain-String-Without-3-Consecutive-'a'

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)
}

2. https://github.com/it3xl/MaxBiValuedSlice

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
}

3. https://leetcode.com/discuss/interview-question/330356/Amazon-or-Online-Assessment-2019-or-Longest-string-without-3-consecutive-characters

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/

4. there are two wooden sticks of length a and b respectively...

給兩條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
}

5. https://leetcode.com/discuss/interview-question/906783/moneris-interview-answers-are-welcomed

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
}

6. https://brainly.com/question/15405872

https://www.chegg.com/homework-help/questions-and-answers/given-array-consisting-n-distinct-integers-would-like-sort-array-ascending-order-using-sim-q38897597

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)
}
mangreen commented 4 years ago

Ubiquiti

Exam內容:

紙筆12題,1題SQL, 2題Node.js, 其他題目是GO

strings.NewReader

https://ithelp.ithome.com.tw/articles/10204484

從 slice 中產生 slice,產生的 slice 底層還是同一個陣列

https://openhome.cc/Gossip/Go/Slice.html

技術問答:

1. Docker image

RUN 跟 START 差異 docker run 只在第一次運行時使用,將鏡像放到容器中,以後再次啟動這個容器時,只需要使用命令docker start 即可。 docker start的作用是,重新啟動已存在的鏡像。

COPY 跟 ADD 差異 https://blog.csdn.net/liukuan73/article/details/52936045 基本一樣但ADD多了 可以使用URL作為參數下載文件 並有能力自動解壓文件

2. Restful API 定義,

https://ihower.tw/blog/archives/6483

3. Design Pattern,

https://skyyen999.gitbooks.io/-study-design-pattern-in-java/content/strategy.html https://juejin.im/post/6844903512317378568

4. Linux 指令

Web HTTP 封包除錯技巧(Linux Server Tcpdump)

https://blog.toright.com/posts/3442/%E4%BD%A0%E4%B9%9F%E6%9C%83%E7%9A%84-web-http-%E5%B0%81%E5%8C%85%E9%99%A4%E9%8C%AF%E6%8A%80%E5%B7%A7%EF%BC%88server-%E7%AF%87%EF%BC%89.html

5. Secruity方面問題: 基礎的對稱式和非對稱式簡介

https://medium.com/@RiverChan/%E5%9F%BA%E7%A4%8E%E5%AF%86%E7%A2%BC%E5%AD%B8-%E5%B0%8D%E7%A8%B1%E5%BC%8F%E8%88%87%E9%9D%9E%E5%B0%8D%E7%A8%B1%E5%BC%8F%E5%8A%A0%E5%AF%86%E6%8A%80%E8%A1%93-de25fd5fa537

6. TCP & UDP

7. protobuf

mangreen commented 4 years ago

docker

壓縮 image 大小

https://www.infoq.cn/article/3-simple-tricks-for-smaller-docker-images http://dockone.io/article/8163

1. 使用 && 代替使用两个 RUN 语句減少 layer

&&

FROM ubuntu
RUN apt-get update && apt-get install vim

兩個 RUN

FROM ubuntu
RUN apt-get update
RUN apt-get install vim

2. multi stage

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"]

3. 用 distroless 去除容器中刪除 Node.js 之外的不必要的東西

4. 小體積的 Alpine 基礎鏡像

5. 壓縮鏡像

Docker自帶的一些命令還能協助壓縮鏡像,比如export和import

$ docker run -d test/test:0.2
$ docker export 747dc0e72d13 | docker import - test/test:0.3

6. RUN命令中執行apt、apk或者yum類工具技巧

如果在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 命令清理。

加快 build image 速度

1. 使用 Docker BuildKit 加速編譯 Image

https://blog.wu-boy.com/2020/04/speed-up-docker-build-using-docker-buildkit/

2. 使用 cache-from 提升編譯速度

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 使用掉多少的系統資源。

mangreen commented 2 years ago

高併發

搶票

token

  1. 預先準備好同等數量的 token
  2. 排隊搶 token
  3. 搶到 token 才能進行下個步驟 (選座位, 填資料, 付款...)
  4. 失敗就 release token 或 銷毀token 產生新的

商城

樂觀鎖 Optimistic Lock

  1. 資料庫可以有 updatedAt or lock owner
  2. 先選座位, 填資料, 付款...
  3. 寫入時確認 updatedAt or owner 是否一致  - 一致就寫入  - 不一致表示期間資料已被更新放棄寫入 通知user失敗

    分散式樂觀鎖 - Redis Transactions

  4. WATCH/EXEC
  5. Check & Set
mangreen commented 2 years ago

mongoDB

三種集群的區別 Replica Set vs Sharding vs Master-Slaver

1. Master/Slave

先說最後一個,是Master/Slave,不是Slaver。這種方式基本上不再推薦使用,只能從Master復制數據到Slave,並不提供高可用,一旦Master結點出故障就比較難處理。具體細節就不說了,反正已經不推薦使用。

2. Replica Set

即常說的復制集。復制集的主要目標有幾個:

高可用(主要目標):當一個結點故障時自動切換到其他結點; 數據冗餘(主要目標):數據復制到n個結點上,增加數據安全性,同時為高可用提供基礎; 功能隔離(次要目標):使用不同的結點隔離某些有特殊需求的功能,比如使用一個結點進行OLAP運算(大規模資源佔用),使用一個結點在遠程做災備(性能要求不如本地高),讀寫分離等等;

3. Sharded Cluster

即分片集。分片集的主要設計目標是:

水平擴展:當一台服務器滿足不了需求的時候,我們可以選擇垂直擴展(增加服務器硬件),它雖然簡單,但很容易達到極限,並且面臨成本高等明顯缺點。成本更低的方式是使用n台服務器組成集群來滿足系統需求。這就是分片集的主要設計目標; 縮短響應時間:因為可以把數據分散到多台服務器上,自然每台服務器的處理壓力減小,處理時間就會縮短; 這裡會出現一個問題:假設每台服務器出故障的機率是x%,那麼n台服務器有一台出現故障的機率就是x% * n,如果不做高可用設計,集群出現故障的概率就會隨機器數量成正比增長,這在工程上是不能接受的。幸運的是我們已經有瞭解決高可用的方案,也就是復制集。所以MongoDB的分片集群要求每一個片都是復制集(當然測試環境也可以使用單結點,生產環境不推薦)。

mangreen commented 2 years ago

RabbitMQ

https://www.cnblogs.com/davidgu/p/14702449.html