Uber Interview


优步面经
Email domain address typo, need to figure out and return correct domain name. e.g. yhaoo–> yahoo, giaml –> gmail, hmailot–> hotmail.
Solution: HashMap, key as sorted string, value as correct email domain
其实是anagram
public String getEmail(String s) {
  Map<String, String> map = new HashMap<String, String>();
  //init the map with the string
   
  String[] email = {"yahoo", "gmail", "hotmail" ..};
  for (String e : email) {
    map.put(sortByChar(e), e);
  }
  if (map.containsKey(sortByChar(s)) {
    return map.get(sortByChar(s));
  }
  return null;
}
private String sortByChar(String s) {
  char[] charArray = s.toCharArray();
  Arrays.sort(charArray);
  return new String(charArray);
}
Design Uber, web service, API, database.

given a > b, b > c, if pass in c > a return false, if a > c return true

感觉像是topological sort,实际上直接dfs就可以,因为只要找到了back edge,就说明顺序是不对的

如果对于cross edge,假设我们认为cross edge return false的话,就好办了,我们只需要按顺序搜,搜到了的话就return true,不然就return false。如果相反的话,我们就要把input反过来,如果搜到了就return false,不然就return true。这里假设input保证没有loop。
public boolean checkOrder(char c1, char c2, List<Char[]> orders) {
  Map<Character, Set<Character>> adjMatrix = new HashMap<Character, Set<Character>>();
  for (Char[] pair : orders) {
    char from = pair[0];
    char to = pair[1];
    Set<Character> set = null;
    if (!adjMatrix.containsKey(from)) {
      set = new HashSet<Character>();
      adjMatrix.put(from , set);
    } else {
      set = adjMatrix.get(from);
    }
    set.add(to);
  }
  Set<Character> visited = new HashSet<Character> visited;
  return dfsFind(adjMatrix, c1, c2);
}
private boolean dfsFind(adjMatrix, char start, char target) {
  if (start == target) {
    return true;
  }
  Set<Character> curr = adjMatrix.get(start);
  for (Character c : curr) {
    if (dfsFind(adjMatrix, c, target)) {
      return true;
    }
  }
  return false;
}

做tiny url
其实就是转换成base 62的数。
Spiral Array Print
1,Run-Length Encoding,就是把aaabbcccaaaa变成3a2b3c4a这样,要求encode后的信息要比原来的短。
public String encode(String s) {
      int start = 0;
      StringBuilder res = new StringBuilder();
      for (int i=1; i<=s.length(); i++) {
        if (i == s.length() || s.charAt(i) != s.charAt(start)) {
            if (i - start > 2) {
              res.append(String.valueOf(i-start));
              res.append(s.charAt(start));
            } else {
              res.append(s.substring(start, i));
            }
            start = i;
        }
      }
       
      return res.toString();
    }

首先暴力扫描之。然后问有什么问题,答曰decode的时候111aaa会encode成313a然后decode成313个a。提出每encode一个就插入一个特殊符号标记,他说可以。然后追加问是否可以不用特殊符号,答曰创建新的计数单位,比如用A代表1B代表2,然后aaa就变成Ca(you get the idea),这样就不需要插入额外符号了。
3. Coding Question,用的coderPad, 比较两个Map Object,Map的Value可能有两种情况
1. Strings; 2. Map objects
public boolean compare(Object obj1, Object obj2) {
  if (obj1 instance of String && obj2 instance of String) {
    return (String)obj1.equals((String)obj2);
  }
   
  if(obj1 instance of Map<String, Object> && obj2 instance of Map<String, Object>) {
    Map<String, Object> map1 = (Map<String, Object>) obj1;
    Map<String, Object> map2 = (Map<String, Object>) obj2;
    if (map1.size() != map2.size()) {
      return false;
    }
    Iterator iter = map1.keySet().iterator();
    while (iter.hasNext()) {
      String key = (String)iter.next();
      if (!map2.containsKey(key)) {
        return false;
      }
      if (!compare(map1.get(key), map2.get(key)) {
        return false;
      }
    }
    return true;
  }
}

形式化来说,给N个未排序的数组,找出全局中位数。
应用场景是,有N个hosts,每隔一段时间就会报告一些参数,比如qps和平均延迟等,现有某个用于monitor的机器收集信息,并且返回特定时间段内同一参数所有数据的的中位数。
先给brute force,对所有数据排序然后找中位数。
一个stream找中位数的话,可以用两个heap,一个minHeap保存大一半的数,另外一个maxHeap保存小的一半的中位数。如果新来一个数的话,我们看他是比minHeap和maxHeap最大的数比较,然后加进其中一个heap,如果在两个之间的话,假设我们就放进minHeap里,然后需要平衡一下两个heap,保证minHeap和maxHeap的size是相同的。
class MedianFinder {
  PriorityQueue<Integer> minHeap;
  PriorityQueue<Integer> maxHeap;
  public MedianFinder() {
    this.minHeap = new PriorityQueue();
    this.maxHeap = new PriorityQueue(10, Collections.reverseOrder());
  }
 
  public void addData(int i) {
    if (i >= minHeap.getFirst()) {
      minHeap.add(i);
    } else (
      maxHeap.add(i);
    }
    //rebalance two heaps
    if (minHeap.size() - maxHeap.size() == 2) {
      int tmp = minHeap.removeFirst();
      maxHeap.add(tmp);
    } else if (maxHeap.size() - minHeap.size() == 2) {
      int tmp = maxHeap.removeFirst();
      minHeap.add(tmp);
    }
  }
 
  public int getMedian() {
    if (minHeap.size() == maxHeap.size()) {
      return (minHeap.getFirst() + maxHeap.getFirst())/2
    }
    return minHeap.size() > maxHeap.size() ? minHeap.getFirst() : maxHeap.getFirst();
  }
}
search element in a roated sorted array. leetcode
Word Ladder II
这道题的idea是先用bfs找到最短路径,然后dfs找出所有的结果。
第一轮: Happy number
第二轮: 罗马数字 -> 阿拉伯数字
Happy number就是按照happy number的算法一直算,但是要注意已经visited过了的要记下来,
罗马数字转换成阿拉伯数字的话,就是要一个Map,然后注意每次greedy pick最大的那个数append到结果的右边即可
1. 设计excel, 先实现基本功能再优化(比如存图片怎么弄)
2. 给一个tuple list, 按weight random select. 比如给 [(“hello”, 2.34), (“world”, 4.68)…] world出现的概率是hello的两倍.
第二题, reverse string的变种。 只reverse word不reverse punctuation。比如 “this,,,is.a word” -> “word,,,a.is this”
这道题可以考虑用两个stack,一个用来reverse word,另外一个保存punctuation。
public String reverse(String s) {
      Stack<String> wStack = new Stack<String>();
      Queue<String> pQueue= new LinkedList<String>();
      int start = 0;
      boolean isChar = true;
      int end = 0;
      for (int i=0; i<s.length(); i++) {
        char c = s.charAt(i);
        if (!Character.isLetter(c)) {
          if (isChar) {
            wStack.push(s.substring(start, i));
            start = i;
            isChar = false;
          } else {
            continue;
          }
        } else {
          if (isChar) {
            continue;
          } else {
            pQueue.add(s.substring(start, i));
            start = i;
            isChar = true;
          }
        }
      }
      //last word or punctuation
      if (isChar) {
        wStack.push(s.substring(start));
      } else {
        pQueue.add(s.substring(start));
      }
      //form the new string, assuming always start with a word
      StringBuilder sb = new StringBuilder();
       while (!wStack.isEmpty()) {
         sb.append(wStack.pop());
         if (!pQueue.isEmpty()) {
             sb.append(pQueue.remove());
         }
       }
       return sb.toString();
    }
3. bar raiser. 是一个front end engineer (我面的是backend)但要我把我的project给他讲清楚。结果不讲不知道一讲吓一跳,backend懂得比我还多
4. design一个uber eat。说是system design结果我感觉更像product design
5. engineering manager. 一个老中 刚来没多久。问了我许多问题结果感觉对我不大满意。比如问我写service到底理解到多deep。data storage平时接触没(确实没怎么 – 都在application层面 – 摊手)

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