# Jean ###### tags: `mock_interview` ### Conveyor ```javascript= words = ["", "a", "ab", "ba", "ba", "ba", "baaa", "bag", "bb", "cat"] prefix = "ba" => 5 words = [ ["I", "am", "Sam"], ["I", "am", "Andy"], ["I", "like", "apple"], ["a", "b", "c"], ["b", "a", "c"], ] predict("I") // "am" const dict = { "I": { max: "am" next: { "am": 2, "like": 1 } }, } nums = [1, 6, 4, 2, 5, 3], K = 4 stack = [1] stack = [1, 6] stack = [1, 4] r = [6] stack = [1, 2] r = [6, 4] stack = [1, 2, 5] r = [6, 4] stack = [1, 2, 3] r = [6, 4, 5] r.sort() => [4, 5, 6] merge ``` ```python= def solve(G): M, N = len(G), len(G[0]) def next_dir(x, y, d): if d == 0: return x, y + 1 elif d == 1: return x + 1, y elif d == 2: return x, y - 1 else: return x - 1, y vis = {} def dfs(x, y, curr_vis, cost): key = (x, y) if key in curr_vis: return float('inf') if key in vis and cost >= vis[key]: return vis[key] if x == M - 1 and y == N - 1: return cost curr_vis.add(key) res = float('inf') (G[x][y] + 2) % 4 for d in range(4): next_x, next_y = next_dir(x, y, d) if 0 <= next_x < M and 0 <= next_y < N: next_cost = int(d != G[x][y]) res = min( res, dfs(next_x, next_y, curr_vis, cost + next_cost) ) curr_vis.remove(key) vis[key] = res return res ans = dfs(0, 0, set(), 0) return ans # 0: right # 1: down # 2: left # 3: up G = [ [0, 0, 0, 1], [1, 2, 2, 2], [0, 0, 0, 1], [1, 2, 2, 2], [0, 0, 3, 0], ] print(solve(G)) ``` ```javascript= // 2022/04/14 target = 12 position = [10,8,0,5,3] speed = [2, 4,1,1,3] [0, 1] [2] [3, 4] => 3 car1 car2 (target - s1)/ v1 < (target - s2) / v2 s1 + v1*t = s2 + v2*t t = (s2 - s1) / (v1 - v2) new car (v2) starting at : s2 + v2 * ((s2 - s1) / (v1 - v2)) a, b => b a, b, c, d, e, f a, b => ab ab, c => abc abc, d, e => abc, de abc, de, f => function carCollision(target, position, speed){ const cars = [] // car speed sorted by position let result = cars.length; const carSets = [cars[0]] for(let i = 1; i < cars.length; i++){ p, s = speed[i], position[i] stack = [[speed, position]] while stack and abs(p - stack[-1][1]) / abs(s - stack[-1][0]) <= (target - p) / s: stack.pop() stack.append((s, p)) => [slowest, ... , fastest] if(cars[i] collide with carSets[carSets.length - 1]){ carSets[carSets.length - 1] = cars[i] while(carSets.length > 1 && carSets[carSets.length - 1] collide carSets[carSets.length - 2]){ // merge carSets[carSets.length - 1] & carSets[carSets.length - 2 [2, 1] => [1] const lastV = carSets.pop() carSets[carSets.length - 1] = lastV c[1] = 1 } }else{ carSets.push(cars[i]) } } return carSets.length } // 2022/04/07 books = [1, 2, 3, 4, 5] int search(book_page): void swap(a_idx, b_idx): cache = [{2: 3}, {1: 2}] put(1, 3) search(2) // 3 Total = 4 + 6 = 10 // a = new Deque([1, 2, 3]) // a.shift() arr[i] // O(1) dq[i] // O(N) // pizza = [6,1,2,3,4,5] // pizza[i] + dp(pizza) // dp(pizza){ // for(let piece of pizza) // const newPizza = pizza.splice(i-1, 3) // } function maxPizzaValue(pizza){ const memo = {} function helper(pizza){ // [1, 2, 3, 4, 5, 6], [3, 4, 5] if(pizza.length === 0) return 0 const key = pizza.join('-') if(key in memo) return memo[key] let max = 0; for(let i = 0; i < pizza.length; i++){ // i = 0, 0 const newPizza = [...pizza] if(i === 0 || i === pizza.length - 1){ newPizza.splice(i, 1) newPizza.pop() newPizza.shift() }else{ newPizza.splice(i-1, 3) } // newPizze = [3, 4, 5], [] const value = pizza[i] + helper(newPizza); // value = 3 + 0 max = Math.max(max, value) } memo[key] = max return max } return helper(pizza) } [9, 10, 9, 1, 1, 1] // 2022/03/31 //G = [[[1,2], [1, 16], [2, 8]],[[]]] // queries = [ // [src, tgt, max_weight], ... // ] // [true, false, true, ...] // 5 -> 7, 10 # True // 5 -> 7, 15 # True function hasPathWithinWeight(G, n, source, target, maximumWeight){ const queue = [source]; const visited = new Array(n).fill(false) while(queue.length){ // N const node = queue.shift() // N if(node === target) return true visited[node] = true for(let [adjNode, weight] of G[node]){ // one node edge number => E if(weight <= maximumWeight && !visited[adjNode]){ queue.push(adjNode) } } } return false } sort Queries by max weigth sort Edge by weigth edge_idx = 0 u = Union(N) for src, tgt, max_w in Query: while edge_idx < len(Edge) and Edge[edge_idx][2] <= max_w: u.union(Edge[edge_idx][0], Edge[edge_idx][1]) p_src = u.find(src) p_tgt = u.find(tgt) ans.append(p_src == p_tgt)