# 亞麻OA 校招 ### Searching in a 2D matrix ```java class Point { int x; int y; } Point isInMatrix(int[][] matrix, int target){ int row = matrix.length; int column = matrix[0].length; int r = 0; int c = column - 1; while (r < row && c >= 0){ if (matrix[r][c] == target){ return new Point(r,c); } if (matrix[r][c] > target){ c--; } else { r++; } } return new Point(-1,-1); } ``` ### Critical connections ```python class Solution: def criticalConnections(self, n: int, connections: List[List[int]]) -> List[List[int]]: graph = collections.defaultdict(list) for i, j in connections: graph[i].append(j) graph[j].append(i) ans = [] states = [-1] * n #Start from 0, if we find the step is smaller or equal to the minimum step, it means ring exist. def dfs(curr, parents, steps): states[curr] = steps + 1 #Min step now for child in graph[curr]: if child == parents: continue #go back and forth elif states[child] == -1: #haven't vistied states[curr] = min(states[curr], dfs(child, curr, steps + 1)) else: #if we find smaller step, update it states[curr] = min(states[curr], states[child]) #Check if the step changes, but 0 which is the starting point should be excluded if states[curr] == steps + 1 and curr != 0: ans.append([parents, curr]) return states[curr] dfs(0, -1, 0) return ans ``` ### Copy List with Random Pointer ```python class Node: def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None): self.val = int(x) self.next = next self.random = random class Solution: def copyRandomList(self, head: 'Node') -> 'Node': dummy = Node(0) nodeDict = {} newHead, curr = dummy, head while curr: node = Node(curr.val) nodeDict[curr] = node newHead.next = node newHead = newHead.next curr = curr.next curr = head while curr: if curr.random: nodeDict[curr].random = nodeDict[curr.random] curr = curr.next return dummy.next ``` ### Jenny(題目沒看到只記得有個人叫Jenny) ```python from collections import defaultdict, deque N, M, K = map(int, input().split()) graph = defaultdict(list) v, max, cost, ans = [False] * (N + 1), 0, 0, 0 def BFS(start, ok = False): if v[start]: return global max, cost, ans v[start], nr, edges = True, 1, set() queue = deque([start]) while queue: node = queue.popleft() for next_node in graph[node]: if not v[next_node]: nr += 1 v[next_node] = True queue.append(next_node) if not (node, next_node) in edges and not (next_node, node) in edges: edges.add((node, next_node)) ans += nr * (nr - 1) // 2 - len(edges) if ok: if (nr > max): max = nr else: global nr_without_water ans += nr_without_water * nr cost += nr_without_water * nr nr_without_water += nr while M: M -= 1 x, y = map(int, input().split()) graph[x].append(y) graph[y].append(x) for water_point in map(int, input().split()): # 1 BFS(water_point, True) nr_without_water = 0 # 2 for i in range(1, N + 1): BFS(i) ans += max * nr_without_water # 3 cost += max * nr_without_water print(ans, cost) # 4 ``` ### Connecting city with minimum cost ```python def minimumCost(self, N: int, connections: List[List[int]]) -> int: parents = [x for x in range(N)] ranks = [1] * N def find(u): while u != parents[u]: parents[u] = parents[parents[u]] u = parents[u] return u def union(u, v): root_u, root_v = find(u), find(v) if root_u == root_v: return False if ranks[root_v] > ranks[root_u]: root_u, root_v = root_v, root_u parents[root_v] = root_u ranks[root_u] += ranks[root_v] return True connections.sort(key = lambda x: x[2]) ans = 0 for u, v, val in connections: if union(u-1, v-1): ans += val groups = len({find(x) for x in parents}) return ans if groups == 1 else -1 ``` ### Subtree with Maximum Average ```python class TreeNode: def __init__(self, val, children): self.val = val self.children = children class Solution: def maxAverage(self, root): if not root or not root.children: return None # self.res = [max average, tree node of the max average] self.res = [float('-inf'), root)] self.dfs(root) return self.res[1] def dfs(self, root): if not root.children: return [root.val, 1] cur_val, cur_count = root.val, 1 for node in root.children: child_val, child_count = self.dfs(node) cur_val += child_val cur_count += child_count cur_average = cur_val / float(cur_count) if cur_average > self.res[0]: self.res = [cur_average, root] return [cur_val, cur_count] ``` ```python def maximumAverageSubtree(self, root): self.res = 0 def helper(root): if not root: return [0, 0.0] n1, s1 = helper(root.left) n2, s2 = helper(root.right) n = n1 + n2 + 1 s = s1 + s2 + root.val self.res = max(self.res, s / n) return [n, s] helper(root) return self.res ``` ### Battle Ship ```python S = "1B 2C,2D 4D" T = "2B 2D 3D 4D 4A" tothit, totsunk = 0,0 def noPos(i): no = '' pos = '' for j in i: if(0 <= ord(j) - ord('0') <=9): no+=j else: pos+=j no = int(no) pos = ord(pos)-ord('A') return[no, pos] target = [] S = S.split(',') T = T.split() for i in T: target.append(noPos(i)) for i in S: i = i.split() hit, sunk, count = 0,0,0 rlow, rhigh, clow, chigh =0,0,0,0 cc= 0 for k in i : if(cc == 0): rlow, clow = noPos(k) cc+=1 else: rhigh, chigh = noPos(k) for r in range(rlow, rhigh+1): for c in range(clow, chigh+1): count+=1 if([r, c] in target): hit+=1 if hit == count: totsunk+=1 elif(0<hit<count): tothit+=1 print("total ships hit are ", tothit, " and total sunk are ", totsunk) ``` ### Robot throw, robotic challenge ```python class Solution(object): def calPoints(self, ops): # Time: O(n) # Space: O(n) history = [] for op in ops: if op == 'C': history.pop() elif op == 'D': history.append(history[-1] * 2) elif op == '+': history.append(history[-1] + history[-2]) else: history.append(int(op)) return sum(history) ``` ### Distance Between Nodes in BST ```python class TreeNode(object): def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def insert(root, val): if root == None: return TreeNode(val=val) if val < root.val: root.left = insert(root.left, val) else: root.right = insert(root.right, val) return root bst = [] def preorder(root): if root == None: bst.append(None) return bst.append(root.val) preorder(root.left) preorder(root.right) def lowestCommonAncestor(root, p, q): """ :type root: TreeNode :type p: int :type q: int :rtype: TreeNode """ parent_val = root.val if p < parent_val and q < parent_val: return lowestCommonAncestor(root.left, p, q) if p > parent_val and q > parent_val: return lowestCommonAncestor(root.right, p, q) return root def height(root, val): if root.val == val: return 0 if val < root.val: return (height(root.left, val) + 1) else: return (height(root.right, val) + 1) l = [4, 2, 7, 1, 3, 5] p = 1 q = 2 root = None for val in l: root = insert(root, val) preorder(root) print bst lca = lowestCommonAncestor(root, p, q) print lca.val h1 = height(lca, p) h2 = height(lca, q) print h1, h2 print h1 + h2 ``` ### Treasure Island ```python def solution(m): if len(m) == 0 or len(m[0]) == 0: return -1 # impossible matrix = [row[:] for row in m] nrow, ncol = len(matrix), len(matrix[0]) q = deque([((0, 0), 0)]) # ((x, y), step) matrix[0][0] = "D" while q: (x, y), step = q.popleft() for dx, dy in [[0, 1], [0, -1], [1, 0], [-1, 0]]: if 0 <= x+dx < nrow and 0 <= y+dy < ncol: if matrix[x+dx][y+dy] == "X": return step+1 elif matrix[x+dx][y+dy] == "O": # mark visited matrix[x + dx][y + dy] = "D" q.append(((x+dx, y+dy), step+1)) return -1 ``` ### Valid Parentheses ```python class Solution: def isValid(self, s: str) -> bool: stack = [] d = {"[": "]", "{":"}", "(":")"} for i in s:a if i in d: stack.append(i) else: if not stack or d[stack.pop()] != i : return False return True if not stack else False ``` ### Longest Palindromic Substring ```python class Solution: def longestPalindrome(self, s: str) -> str: n = len(s) def getLen(s, l, r): while l >= 0 and r < n and s[l] == s[r]: l -= 1 r += 1 return r - l -1 start, length, end = 0, 0, 0 for i in range(n): curr = max(getLen(s, i, i), getLen(s, i, i+1)) if curr < length: continue length = curr start = i - (length-1) // 2 end = start + length return s[start: end] ``` ### Search Suggestions System , Keyword Suggestions ```python def suggestedProducts(self, A, word): A.sort() res, prefix, i = [], '', 0 for c in word: prefix += c i = bisect.bisect_left(A, prefix, i) res.append([w for w in A[i:i + 3] if w.startswith(prefix)]) return res ``` ### Count teams ```python import math def solution(num, skills, minAssociates, minLevel, maxLevel): satis = 0 for skill in skills: if minLevel <= skill <= maxLevel: satis+=1 ans = 0 for i in range(minAssociates, satis+1): ans += math.factorial(satis) / math.factorial(i) * math.factorial(satis - i) return ans ``` ### Fetch Item to display ```java public class Main { public static List<String> fetchItemsToDisplay(int numOfItems, HashMap<String, Pair<Integer, Integer>> items, int sortParameter, int sortOrder, int itemsPerPage, int pageNumber) { if(items.size() == 0) return Collections.EMPTY_LIST; SortedSet<Map.Entry<String, Pair<Integer, Integer>>> set = new TreeSet<>(new Comparator<Map.Entry<String, Pair<Integer, Integer>>>() { @Override public int compare(Map.Entry<String, Pair<Integer, Integer>> entry1, Map.Entry<String, Pair<Integer, Integer>> entry2) { if(sortParameter == 0) { if(sortOrder == 0) return entry1.getKey().compareTo(entry2.getKey()); return entry2.getKey().compareTo(entry1.getKey()); } if(sortParameter == 1) { if(sortOrder == 0) return (int) entry1.getValue().getKey() - (int) entry2.getValue().getKey(); return (int) entry2.getValue().getKey() - (int) entry1.getValue().getKey(); } if(sortParameter == 2) { if(sortOrder == 0) return (int) entry1.getValue().getValue() - (int) entry2.getValue().getValue(); return (int) entry2.getValue().getValue() - (int) entry1.getValue().getValue(); } return 0; } }); set.addAll(items.entrySet()); List<String> result = new ArrayList<>(); for(Map.Entry<String,Pair<Integer, Integer>> entry : set) result.add(entry.getKey()); int start = pageNumber * itemsPerPage; int end = (start + itemsPerPage) > result.size() ? result.size() : start + itemsPerPage; return result.subList(start, end); } public static void main(String[] args) { int numOfItems = 3; HashMap<String, Pair<Integer, Integer>> items = new HashMap<>(); items.put("item1", new Pair<Integer, Integer>(10, 15)); items.put("item2", new Pair<Integer, Integer>(3, 4)); items.put("item3", new Pair<Integer, Integer>(17, 8)); int sortParameter = 1; int sortOrder = 0; int itemsPerPage = 2; int pageNumber = 1; System.out.println(fetchItemsToDisplay(numOfItems, items, sortParameter, sortOrder, itemsPerPage, pageNumber)); } } ``` ### Find the highest profit ```python suppliers = [3, 5] order = 6 import heapq max_heap = [] for product in suppliers: heapq.heappush(max_heap, -product) profit = 0 while max_heap and order > 0: product = heapq.heappop(max_heap) product_profit = -product profit += product_profit if product_profit > 0: product_profit -= 1 heapq.heappush(max_heap, -product_profit) ``` ### Break a Palindrome ```python def breakPalindrome(self, S): for i in xrange(len(S) / 2): if S[i] != 'a': return S[:i] + 'a' + S[i + 1:] return S[:-1] + 'b' if S[:-1] else '' ``` ### Fill The Truck ```python import heapq def fillTheTruck(num, boxes, unitSize, unitsPerBox, truckSize): pq = [] for i in range(len(boxes)): for j in range(boxes[i]): heapq.heappush(pq, -unitsPerBox[i]) ans = 0 while truckSize > 0 and pq: ans += - heapq.heappop(pq) truckSize -= 1 return ans ``` ### Optimal Utilization ```python class Solution: def findPairs(self, a, b, target): a.sort(key=lambda x: x[1]) b.sort(key=lambda x: x[1]) l, r = 0, len(b) - 1 ans = [] curDiff = float('inf') while l < len(a) and r >= 0: id1, i = a[l] id2, j = b[r] if (target - i - j == curDiff): ans.append([id1, id2]) elif (i + j <= target and target - i - j < curDiff): ans.clear() ans.append([id1, id2]) curDiff = target - i - j if (target > i + j): l += 1 else: r -= 1 return ans ``` ### Cut off Rank ```python def GetRanks(cutOffRank, numScores, scores): scores.sort() rank = [] if cutOffRank == numScores: return numScores rank.append(1) for i in reversed(range(1, len(scores))): if scores[i] == scores[i-1]: rank.append(i-1) else: rank.append(i) ans = 0 for j in range(len(rank)): if rank[j] <= cutOffRank: ans += 1 return ans ``` ### Min Cost to Connect Rope ```python def minCost(ropes: List[int]) -> int: if not ropes: return 0 if len(ropes) == 1: return ropes[0] heapify(ropes) cost = 0 while len(ropes) > 1: a, b = heappop(ropes), heappop(ropes) cost += a+b if ropes: heappush(ropes, a+b) return cost ``` ### Amazon Fresh Promotion ```python secret_code = [['apple', 'apple'], ['banana', WILD_CARD, 'banana']] user_purchase = ['apple', 'apple', 'apple', 'banana'] expected 0 secret_code = [['apple', 'apple']] user_purchase = ['apple', 'apple', 'apple', 'banana'] expected 1 secret_code = [] user_purchase = ['apple', 'apple', 'apple', 'banana'] expected 1 WILD_CARD = 'anything' # Time complexity is O( n + m ) def is_winner(secret_code, shopping_cart): if not secret_code: return True shopping_cart_length = len(shopping_cart) shopping_cart_index = 0 # Moving index to scan through shopping cart secret_index = 0 # Moving index to scan through each secret start_cart_index = 0 # to be able to reset search if partial secret was found previous_scan_index = 0 # If one secret was found, we want to offset the search by the last index in the shopping cart for i in range(len(secret_code)): secret = secret_code[i] # Current secret we are looking for secret_l = len(secret) # Length of current secret we are looking for secret_index = 0 matched_secret = 0 while matched_secret != secret_l: if (start_cart_index + shopping_cart_index) >= shopping_cart_length: return 0 item = shopping_cart[start_cart_index+shopping_cart_index] if item == secret[secret_index] or secret[secret_index] == WILD _CARD: secret_index += 1 matched_secret += 1 shopping_cart_index += 1 else: shopping_cart_index = previous_scan_index start_cart_index += 1 if secret_index != 0: secret_index = 0 matched_secret = 0 previous_scan_index = shopping_cart_index if secret_index == len(secret_code[-1]): return 1 return 0 ``` ```python def isWinner(secret, shoppingCart): def isMatch(source, target): return target == "anything" or target == source index = 0 secretIndex = 0 newIndex = index secretWordIndex = 0 while secretIndex < len(secret) and newIndex < len(shoppingCart): if isMatch(shoppingCart[newIndex], secret[secretIndex][secretWordIndex]): newIndex+=1 secretWordIndex+=1 if secretWordIndex==len(secret[secretIndex]): index+=1 index=newIndex secretWordIndex=0 else: index+=1 newIndex=index secretWordIndex=0 return 1 if secretIndex == len(secret) else 0 ``` ### Items in Containers ```python def numberOfItems(s, startIndicies, endIndicies): n = len(s) preSum = [0] * n leftCompIdx =[0] * n rightCompIdx = [0] * n sum = 0 result = [0] * len(startIndicies) for i in range(n): if s[i] =="*": sum += 1 preSum[i] = sum seen = -1 for i in range(n): if s[i] =="|": seen = i leftCompIdx[i] = seen seen = -1 for i in range(n-1, -1, -1): if s[i] =="|": seen = i rightCompIdx[i] = seen k = 0 while k < len(startIndicies): start = startIndicies[k] - 1 end = endIndicies[k] - 1 if rightCompIdx[start] != -1 and leftCompIdx[end] != -1: result[k] = preSum[leftCompIdx[end]]- preSum[rightCompIdx[start]] k+=1 return result ``` ### Largest Item Association ```python from collections import deque, defaultdict def largest_item_association(item_association): item_map = defaultdict(set) for item_pair in item_association: item_map[item_pair[0]].add(item_pair[1]) item_map[item_pair[1]].add(item_pair[0]) largest_group = [] visited = set() for key in item_map.keys(): if key not in visited: curr_group = [] q = deque() q.append(key) while q: curr = q.popleft() visited.add(curr) curr_group.append(curr) for neighbor in item_map[curr]: if neighbor not in visited: q.append(neighbor) if len(curr_group) > len(largest_group): largest_group = curr_group elif len(curr_group) == len(largest_group): if largest_group > curr_group: largest_group = curr_group largest_group.sort() return largest_group ``` ### Turnstile ```python def turnstile(time, direction): en, ex = [], [] res = [0] * len(time) for i, t in enumerate(time): if direction[i] == 1: ex.append([time[i], i]) else: en.append([time[i], i]) timeCounter, lastTurn = 0, -1 # time is 0 at the beginning and -1 # indicates nothing happened at prior time while ex or en: # Process the exit queue if and only if following conditions are satisfied # If exit queue is not empty and the person at the front of the queue can go out based on his time stamp # and ( Nothing happened at last time stamp i.e. nobody moved in or out so lastTurn will be -1 in this case # or, somebody moved out at last time stamp, in this case lastTurn will be 1 # or, nobody is there in the entrance queue # or, at last time stamp somebody got in but the person at the front of the queue can't go in due to their timestamp if ex and ex[0][0] <= timeCounter and \ (lastTurn == -1 or lastTurn == 1 or not en or (lastTurn == 0 and en[0][0] > timeCounter)): res[ex[0][1]] = timeCounter lastTurn = 1 ex.pop(0) elif en and en[0][0] <= timeCounter: res[en[0][1]] = timeCounter lastTurn = 0 en.pop(0) else: lastTurn = -1 timeCounter += 1 return res ``` ### Five Star Sellers ```python def fiveStartReviews(productRatings, ratingsThreshold): count = 0 tempList = productRatings.copy() while(getRating(tempList) < ratingsThreshold / 100): distinctList = [] for productRating in tempList: distinct = ((productRating[0] + 1) / (productRating[1] + 1) ) - ((productRating[0]) / (productRating[1])) distinctList.append(distinct) index = distinctList.index(max(distinctList)) tempList[index][0] = tempList[index][0] + 1 tempList[index][1] = tempList[index][1] + 1 count = count + 1 return count def getRating(productRatings): sum = 0 for i in productRatings: sum = i[0]/i[1] + sum return sum / len(productRatings) ``` ### Minimum Difficulty of a Job Schedule/Best Beta ```python def minDifficulty(self, A, d): n, inf = len(A), float('inf') if n < d: return -1 dp = [inf] * n + [0] for d in range(1, d + 1): for i in range(n - d + 1): maxd, dp[i] = 0, inf for j in range(i, n - d + 1): maxd = max(maxd, A[j]) dp[i] = min(dp[i], maxd + dp[j + 1]) return dp[0] ``` ### Autoscale Policy ```python def autoScale(ins, A): lim_l, lim_h, th_l, th_h, idle = 1, int(1e8), 25, 60, 10 i, n, ans = 0, len(A), ins while i < n: print(f'{i}-th second, utility is {A[i]}, instance number before action is {ans}') if A[i] < th_l and ans > lim_l: ans, i = (ans + 1) // 2, i + idle elif A[i] > th_h and ans <= lim_h: ans, i = ans * 2, i + idle i += 1 return ans ``` ### Top K Frequently Mentioned Keywords ```python import collections import heapq import string def topMentioned(keywords, reviews, k): def preprocess(word): result = "" for c in word: if c not in string.punctuation: result += c.lower() return result count = collections.Counter() kw = set([w.lower() for w in keywords]) for review in reviews: seen = set() words = review.split(" ") for word in words: w = preprocess(word) if w in kw and w not in seen: count[w] += 1 seen.add(w) pq = [] for key, val in count.items(): heapq.heappush(pq, (-val, key)) return [heapq.heappop(pq)[1] for _ in range(k)] ``` ### Transaction Logs ```python import heapq import collections def getFrauds(logs, threshold): count = collections.Counter() for log in logs: log = log.split(" ") user1 = log[0] user2 = log[1] count[user1] += 1 count[user2] += 1 pq = [] for k, v in count.items(): heapq.heappush(pq, (-int(k), v, k)) ans = [] for _ in range(len(pq)): _, freq, id = heapq.heappop(pq) if freq >= threshold: ans.append(id) return ans getFrauds(logs, threshold) ``` ### Substrings of size K with K distinct chars ```python def substringk(s, k): if not s or k == 0: return [] letter, res = {}, set() start = 0 for i in range(len(s)): if s[i] in letter and letter[s[i]] >= start: start = letter[s[i]]+1 letter[s[i]] = i if i-start+1 == k: res.add(s[start:i+1]) start += 1 return list(res) ``` ### Substrings of size K with K distinct chars ```python import collections def substringk(s, k): if not s or k == 0: return [] ch = collections.Counter() ans = set() l, r = 0, 0 while l <= r and r < len(s): ch[s[r]] += 1 while ch[s[r]] > 1: ch[s[l]] -= 1 l += 1 if r - l + 1 == k: ans.add(s[l:r+1]) ch[s[l]] -= 1 l += 1 r += 1 return list(ans) ``` ### Number of islands ```python class Solution: def numIslands(self, grid: List[List[str]]) -> int: m = len(grid) if m < 1: return 0 n = len(grid[0]) def dfs(i,j): grid[i][j] = "0" if i + 1 < m and grid[i+1][j] == "1": dfs(i+1, j) if i - 1 >= 0 and grid[i-1][j] == "1": dfs(i-1, j) if j + 1 < n and grid[i][j+1] == "1": dfs(i, j+1) if j - 1 >= 0 and grid[i][j-1] == "1": dfs(i, j-1) ans = 0 for i in range(m): for j in range(n): if grid[i][j] == "1": dfs(i,j) ans += 1 return ans ``` ### Most common words ```python class Solution: def mostCommonWord(self, paragraph: str, banned: List[str]) -> str: bannedSet = set(banned) words = re.findall(r'\w+', paragraph.lower()) counts = collections.Counter(w for w in words if w not in bannedSet) return max(counts, key=counts.get) ``` ### K closest points to origin ```python def kClosest(self, points, K): """ :type points: List[List[int]] :type K: int :rtype: List[List[int]] """ def quickSelect(arr, left, right, k): p = left l, r = left, right while l < r: while l < r and arr[r][0] >= arr[p][0]: r -= 1 while l < r and arr[l][0] < arr[p][0]: l += 1 arr[l], arr[r] = arr[r], arr[l] arr[p], arr[l] = arr[l], arr[p] if l + 1 == k: return arr[:l+1] elif l + 1 < k: return quickSelect(arr, l + 1, right, k) else: return quickSelect(arr, left, l - 1, k) _index = {(points[i][0]**2 + points[i][1]**2): i for i in range(len(points))} arr = [((y**2 + x**2), [y,x]) for y, x in points] kClosest = quickSelect(arr, 0, len(arr)-1, K) return [kClosest[i][1] for i in range(K)] ``` ### Friend circle ```python class Solution: def findCircleNum(self, M: List[List[int]]) -> int: ans, n = 0, len(M) for i in range(n): if M[i][i] == 1: self.dfs(M, i, n) ans += 1 return ans def dfs(self, M, curr, n): for i in range(n): if M[curr][i] == 1: M[curr][i] = M[i][curr] = 0 self.dfs(M, i, n) ``` ### Partition label ```python class Solution: def partitionLabels(self, S: str) -> List[int]: rightmost = {c: i for i,c in enumerate(S)} l, r = 0, 0 ans = [] for i, c in enumerate(S): # The rightmost position of the letter in the interval we visited so far r = max(r, rightmost[c]) if i == r: ans.append(r - l + 1) l = i + 1 return ans ``` ### wildcard matching ```python class Solution: def isMatch(self, s, p): length = len(s) #patter太長,字串太短 if len(p) - p.count("*") > length: return False dp = [True] + [False] * length for i in p: if i != "*": for j in reversed(range(length)): dp[j+1] = dp[j] and (i == "?" or i == s[j]) else: for j in range(1, length + 1): dp[j] = dp[j-1] or dp[j] dp[0] = dp[0] and i == "*" return dp[-1] ``` ### Recorder Data in log files ```python class Solution: def reorderLogFiles(self, logs: List[str]) -> List[str]: def order(s): id_, payload = s.split(' ', 1) if payload[0].isalpha(): return (0, payload, id_) else: return (1, None, None) return sorted(logs ,key=order) ``` ### Shopping pattern ```python import collections def shoppingPattern(numOfProducts, products_from , products_to): map = collections.defaultdict(set) for i in range(len(products_from)): map[products_from[i]].add(products_to[i]) map[products_to[i]].add(products_from[i]) count = float('inf') for i in range(1, numOfProducts - 2): if len(map[i]) < 2: continue for j in range(i+1, numOfProducts - 1): for k in range(j+1, numOfProducts): if j in map[i] and k in map[j] and i in map[k]: p = (len(map[i]) + len(map[j]) + len(map[k])) - 6 count = min(count, p) return -1 if count == 0 else count ``` ### Maximum Product of Splitted Binary Tree ```python def maxProduct(self, root): self.res = total = 0 def s(root): if not root: return 0 left, right = s(root.left), s(root.right) self.res = max(self.res, left * (total - left), right * (total - right)) return left + right + root.val total = s(root) s(root) return self.res % (10**9 + 7) ``` ### Design a Stack With Increment Operation ```python def __init__(self, maxSize): self.n = maxSize self.stack = [] self.inc = [] def push(self, x): if len(self.inc) < self.n: self.stack.append(x) self.inc.append(0) def pop(self): if not self.inc: return -1 if len(self.inc) > 1: self.inc[-2] += self.inc[-1] return self.stack.pop() + self.inc.pop() def increment(self, k, val): if self.inc: self.inc[min(k, len(self.inc)) - 1] += val ``` ### Third Maximum Number ```python class Solution: def thirdMax(self, nums: List[int]) -> int: max1 = -2**32 max2 = -2**32 max3 = -2**32 for x in nums: if x == max1 or x == max2 or x == max3: continue if x > max1: max3 = max2 max2 = max1 max1 = x elif x > max2: max3 = max2 max2 = x elif x > max3: max3 = x return max1 if max3 == -2**32 else max3 ``` ### Sliding Window maximum ```python class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: q = collections.deque() ans = [] for i in range(len(nums)): while q and nums[i] > q[-1]: q.pop() q.append(nums[i]) #窗口的第一個>=0 if i - k + 1 >= 0: ans.append(q[0]) if nums[i - k + 1] == q[0]: q.popleft() return ans ``` ### Longest Substring with At Most K Distinct Characters ```python class Solution(object): def lengthOfLongestSubstringKDistinct(self, s, k): # Use dictionary d to keep track of (character, location) pair, # where location is the rightmost location that the character appears at d = {} low, ret = 0, 0 for i, c in enumerate(s): d[c] = i while len(d) > k: tmp = low low = min(d.values()) print(tmp, low) del d[s[low]] low += 1 ret = max(i - low + 1, ret) return ret ``` ### Split Array Largest Sum ```python class Solution: def splitArray(self, nums: List[int], m: int) -> int: l, r = max(nums), sum(nums) + 1 def minSum(nums, limit): total = 0 groups = 1 for num in nums: if total + num > limit: total = num groups += 1 else: total += num return groups while l < r: limit = (r - l) // 2 + l if minSum(nums, limit) > m: l = limit + 1 else: r = limit return l ``` ### Label System ```python k = 2 s = sorted(s) length = len(s) flag = 0 remains = list() alike = s[-1] for i in range(len(s)-1,-1,-1): toset = list() if s[i] == alike and i == 0 : flag+=1 toset = s[i+k : flag] del s[i+k : flag] elif s[i] == alike : flag += 1 continue elif s[i] != alike : if flag > k : j = i toset = s[i+1 : i+1+flag-k] del s[i+1 : i+1+flag-k] while toset and j >= 0 : if len(toset)<k : while toset : s.insert(j,toset[0]) toset.pop(0) else: p = 0 while p < k : s.insert(j,toset[0]) toset.pop(0) p+=1 j-=1 flag = 1 alike = s[i] if toset : remains.append(toset) for i in range(len(remains)): j = 0 while remains[i] and j < len(s)-1 : if s[j] != remains[i][0] and s[j+1] != remains[i][0] : if len(remains[i]) > k : p = 0 while p < k : s.insert(j+1,remains[i][0]) remains[i].pop(0) p+=1 else : while remains[i] : s.insert(j+1,remains[i][0]) remains[i].pop(0) elif s[j] == remains[i][0] and s[max(0,j-1)] != remains[i][0]: if s[j:j+k+1].count(remains[i][0]) < k : rem = k - s[j:j+k+1].count(remains[i][0]) while rem and remains[i] : s.insert(j,remains[i][0]) remains[i].pop(0) rem-=1 elif s[j+1] != remains[i][0] and j+1 == len(s)-1: p = 0 while remains[i] and p < k : s.append(remains[i][0]) remains[i].pop(0) p+=1 j += 1 result = ''.join([i for i in s[::-1]]) print(result) ``` ### Labelling System ```python def newLabel(s, limit): n = len(s) charset = [0] * 128 def nextAvailableChar(charset, start): for i in range(start - 1,-1,-1): if charset[i] > 0: charset[i] -= 1 return chr(i) return None for i in range(n): charset[ord(s[i])] += 1 ans = "" for i in range(len(charset) - 1, -1, -1): count = 0 while charset[i] > 0: ans += chr(i) charset[i] -= 1 count += 1 if charset[i] > 0 and count == limit: next = nextAvailableChar(charset, i) if not next: return ans ans += next count = 0 return ans ``` ### Merge two sorted list ```python class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: dummy = ListNode(0) curr = dummy while l1 and l2: if l1.val > l2.val: l1, l2 = l2, l1 curr.next = l1 l1 = curr.next.next curr = curr.next curr.next = l1 or l2 return dummy.next ``` ### subtree of another tree ```python class Solution: def isSubtree(self, s: TreeNode, t: TreeNode) -> bool: if not s and not t: return True if not s or not t: return False return self.sameTree(s, t) or self.isSubtree(s.left, t) or self.isSubtree(s.right, t) def sameTree(self, s, t): if not s and not t : return True if not s or not t: return False return s.val == t.val and self.sameTree(s.left, t.left) and self.sameTree(s.right, t.right) ``` ### Maximal Square ```python class Solution: def maximalSquare(self, matrix: List[List[str]]) -> int: if len(matrix) == 0: return 0 m, n = len(matrix), len(matrix[0]) dp = [[0] * (n+1) for _ in range(m+1)] dp[1][1] = 1 for i in range(1, m+1): for j in range(1, n+1): if matrix[i-1][j-1] == "1": dp[i][j] = min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]) + 1 else: dp[i][j] = 0 return max(map(max, dp)) ** 2 ``` ### throttling gateway ```python import collections def droppedRequests(requestTime): # Write your code here Q1 = [] Q20 = [] Q60 = [] count = 0 for v in requestTime: while len(Q1) > 0 and v - Q1[0] >= 1: Q1.pop(0) while len(Q20) > 0 and v - Q20[0] >= 10: Q20.pop(0) while len(Q60) > 0 and v - Q60[0] >= 60: Q60.pop(0) drop = 0 if len(Q1) < 3: Q1.append(v) else: drop = 1 if len(Q1) > 0: Q1.pop(0) Q1.append(v) if len(Q20) < 20: Q20.append(v) else: drop = 1 if len(Q20) > 0: Q20.pop(0) Q20.append(v) if len(Q60) < 60: Q60.append(v) else: drop = 1 if len(Q60) > 0: Q60.pop(0) Q60.append(v) count += drop # print(Q1, Q20, Q60) return count ``` ### Unique Device Name ```python import collections def getUniqueNames(num, devices): seen = collections.Counter() for i in range(len(devices)): name = devices[i] if devices[i] in seen: name = devices[i] + str(seen[devices[i]]) seen[devices[i]] += 1 devices[i] = name return devices ``` ### Slow key press ```python class Solution: def slowestKey(self, releaseTimes: List[int], keysPressed: str) -> str: maximum, ans = releaseTimes[0], keysPressed[0] for i in range(1, len(releaseTimes)): diff = releaseTimes[i] - releaseTimes[i-1] word = keysPressed[i] if diff > maximum: maximum, ans = diff, word elif diff == maximum and word > ans: ans = word return ans ``` ### Unique pairs ```python def uniqueTwoSum(nums, target): ans = set() for n in nums: c = target-n if c in nums and c >= n: ans.add((n, c)) return len(ans) ``` ### Amazon music pair ```python class Solution: def numPairsDivisibleBy60(self, time: List[int]) -> int: cache = [0] * 60 ans = 0 for t in time: ans += cache[t%60] cache[-t%60] += 1 return ans ```