Google Interview Misc Part 8


http://www.1point3acres.com/bbs/thread-201356-1-1.html
给一批人, 这些人每人都花了一笔钱,
让算, 谁给谁多少钱, 能让所有人都达到平均数


public void calculate(int[] nums) {
                int sum = 0;
                for (int i : nums) {
                        sum += i;
                }
                double avg = sum * 1.0 / nums.length;
                double[] temp = new double[nums.length];
                for (int i = 0; i < nums.length; i++) {
                        temp[i] = avg - nums[i];
                }
                int cur1 = 0; //pos
                int cur2 = 0; //neg
                while (cur1 < nums.length) {
                        while (cur1 < nums.length && temp[cur1] <= 0) {
                                cur1++;
                        }
                        while (cur2 < nums.length && temp[cur2] >= 0) {
                                cur2++;
                        }
                        if (cur1 < nums.length && cur2 < nums.length) {
                                double min = Math.min(temp[cur1], -temp[cur2]);. 鐗涗汉浜戦泦,涓€浜╀笁鍒嗗湴
                                System.out.println("" + cur2 + " gives " + (min) + " to " + cur1);
                                temp[cur1] -= min;
                                temp[cur2] += min;
                        }
                }
        }
http://www.1point3acres.com/bbs/thread-199194-1-1.html
给定一个句子, 和若干个搜索词, 求包含所有搜索词的最短句子长度.
Badmin was able to beat Bill at billiards, but Bill always beat Badmin badly at badminton.

给定搜索词: Query = [Badmin, Bill, beat]
返回 4. 因为子句(Bill always beat Badmin)是包含Query中所有单词的最短子句.

提示: 可以将子句看成倒排的形式如:

"Badmin" = [0, 12]
"Bill" = [5, 9]
"beat" = [4, 11]
其中倒排中的每个index是递增的, 可以利用这点剪枝(?)

这是我面试遇到的问题, 我只想到了暴力解, 就是用dfs枚举所有. 希望大家提供更好的解

这不和minimum window substring一样吗
http://www.1point3acres.com/bbs/thread-197372-1-1.html
1. Given a binary tree, find if there are two subtrees that are the same. (i.e. the tree structures are the same; the values on all corresponding nodes are the same). You should find the largest subtree and don’t use brute force.

我只想到 brute-force,或是用 Map 存整個第一棵樹再掃第二顆做比較,想請問有沒有更好的想法?
把Tree用DFS做serialization , 就变成了找substring的问题了,可以用kmp或者直接用内置方法做吧
参考pre-order遍历序列化一棵二叉树。然后build这个字符串的失败函数。假设某字符的失败函数值为最大,且这个子串不以空开头,即为最大重复子树

假设identical的子树share一个group id. NULL的group id是0.其它子树的group id按照group在后序遍历中第一次出现的时间顺序决定。
这样我们可以一边后序遍历子树,一边建两个hashmap:
(root value, group id of left, group id of right) -> group id of root
group id -> subtrees of this group
这样我们做一遍后序遍历同时维护层数最高、subtree数量>=2的group id就行了。

这个其实跟用整棵子树的serialization作为key做法差不多,只是对key作了压缩。
group id就是一个数字,对应一棵unique的子树。
比如一棵3个结点的树,根结点是10, 两个node是20, 20.
那么group id->node的hash table存的是
0: NULL
1: leftnode, right node
2: root node

(root val, left id, right id)->root id的hashtable存的是
(20, 0, 0) : 1
(10, 1, 1) : 2

所以返回group id 1下面的两个node.

2. Input a matrix, where every number is greater or equal to the numbers on its right and bottom. Output a sorted array

http://www.1point3acres.com/bbs/thread-190439-1-1.html
1. 友善印度小哥。说是考察一群学生的出勤率,如果连续3天来晚(L)就记作差(F),或者任意两天旷课(A)也记作F。成为F就一直是F了。考察30天后,有多少种F的排列组合。
楼主一开始以为是dp,像 decode ways 一样的用两个variables记录之前两天的结果就好了。然后就陷入泥沼了。小哥提示用 automata 解释。画出图来后楼主基本已经蒙了。呵呵,大家可以自己画一画。每一天可以有7种states, 楼主真的呵呵了。自从 valid number 之后就再没用过automata了。. 鐣欏鐢宠璁哄潧-涓€浜╀笁鍒嗗湴

第一个题可以用2个automata的乘积么 The Product Construction for Automata
第一题就是HMM啊。做ML应该都知道。
恩 第一题仔细想想 还是dp的问题 其实也是一个HMM 每个时刻8个状态. 前一个天8个状态合起来求后一天的. 他提示automata 感觉反而能让人弄迷糊 实在是邪恶
int nPermute(int days){
    // Automata
    //    L      L      L
    // I --> L1 --> L2 --> F
    //    A      A
    // I --> A1 --> F
    // state I, I
    int[] dp1 = new int[2];
    // I, A1
    int[] dp2 = new int[2];
    // L1, I
    int[] dp3 = new int[2];
    // L1, A1
    int[] dp4 = new int[2];
    // L2, I
    int[] dp5 = new int[2];
    // L2, A1
    int[] dp6 = new int[2];
    // F. 
    int[] dp7 = new int[2];
    dp1[1] = 1; 
    dp2[1] = 1;
    dp3[1] = 1; 
    dp4[1] = 0; 
    dp5[1] = 1;
    dp6[1] = 0; 
    dp7[1] = 0; 
    for(int i = 1; i <= 30; ++i){
        int iLast = (i+1) % 2;
        int iNow = i % 2;
        // it is infact one HMM transition. 
        dp1[iNow] = dp1[iLast] + dp3[iLast] + dp5[ilast];
        dp2[iNow] = dp1[iLast]; 
        // ...
        // so on and so forth.
    }. 1point3acres.com/bbs
    return dp1[30%2] + ... dp7[30%2]; 
}
我只知道简单做法:
就是dfs 每一天三种可能 (这个要和你confirm)就是L   A  或者 good
然后递归30天后检查这种排法是否F,更新sum变量
可以在dfs过程中检查是否F,然后pass onto最后的检查. 鍥

2. 冷面沉默大叔。第一题two sum smaller。第二题 coin change。第三题 coin change 打出所有case。最后一题 shuffle tree。 答得很顺。

3. 披头金发小伙。先是个sql的问题,选每个周一的前几个data什么balabala的。小哥表达很不清楚。楼主乱答了一通。小伙啥也不说。第二题类似 one edit distance,要比较每种方法的好坏,反复说有木有除了sort,hashmap以外更好的。
. visit 1point3acres.com for more.
4. 木纳白人胖哥。Number of Islands II. 楼主用union-find默写完了。胖哥没多说,只是记。楼主有几个typo也帮忙提示了。然后问如何从union-find的tree里remove node。——。——. 鐣欏鐢宠璁哄潧-涓€浜╀笁鍒嗗湴

5. 和蔼中国大姐。一道system design。 楼主把能记住的部分要求写一下:
做一个cinema的卖票web application。有很多users,在client side。server只有一个。要求�1point3acres璁哄潧
1. 每一个user一次可以看到10个空位。不同的user在同一时间不能看到相同的空位。
2. 如果这个user不满意这10个座位,可以refresh出另外10个,把当前的10个覆盖。
3. 每个user只能buy一个座,这个座必须是她看过的(包括之前覆盖过的和当前的10个)。买座位是通过输入座位号。
4. 买了一个座之后,其余user的当前看到的10个位置如果饱含这个座,要去掉,给个新的。
5. 如果有user要买没看过的座,视为malicious behavior,要制止。
6. user决定refresh或者buy的时间只有2s。


其余还有2个policy楼主记不清了。大姐问得很细,笑里藏刀地,包括用什么data structure,放在client还是server side,performance怎么办等等。哎,我估计architect才能答出来这题。

几天接到hr电话说挂在第三轮了的SQL了,因为楼主在最开始的self-estimation的说自己的SQL 是 6/10。我擦你呀啊!楼主的确是有很多SQL经验啊,但是每个SQL的API都不一样吧。。。况且楼主都是用的打包好的API啊。6分很高吗?多高是高啊。。


Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts