Interview Misc Part 3


http://ninefu.github.io/blog/RelationCosts/
 public List<Node> findShortestPath(List<List<Integer>> relations, int start, int target) {
  if (relations == null || relations.size() < 0) {
   return null;
  }
  HashMap<Integer, Node> map = new HashMap<>();
  for (int i = 0; i < relations.size(); i++) {
   Node person;
   if (map.containsKey(i)) {
    person = map.get(i);
   } else {
    person = new Node(i);
    map.put(i, person);
   }
   if (i == start) {
    person.minCost = 0;
    person.minPath.add(person);
   }
   for (Integer integer : relations.get(i)) {
    Node after = map.getOrDefault(integer, new Node(integer));
    map.put(integer, after);
    person.frontier.add(after);
   }
  }
  
  dijkstra(map, start, target);
  return map.get(target).minPath;
 }
 
 public void dijkstra(HashMap<Integer, Node> map, int start, int target) {
  PriorityQueue<Node> frontiers = new PriorityQueue<>((a,b) -> (a.minCost - b.minCost));
  Node startNode = map.get(start);
  for (Node next : startNode.frontier) {
   next.minCost = (next.person - startNode.person) * (next.person - startNode.person);
   next.minPath = new LinkedList<>(startNode.minPath);
   next.minPath.add(next);
   frontiers.add(next);
  }
  while (!frontiers.isEmpty()) {
   Node cur = frontiers.poll();
   for (Node next : cur.frontier) {
    int oldCost = next.minCost;
    int cost = cur.minCost + (next.person - cur.person) * (next.person - cur.person);
    if (cost < next.minCost) {
     next.minCost = cost;
     next.minPath = new LinkedList<>(cur.minPath);
     next.minPath.add(next);
    }
    if (oldCost == Integer.MAX_VALUE) {
     frontiers.add(next);
    }
   }
  }
 }
 
 public class Node {
  int person;
  int minCost;
  List<Node> minPath;
  List<Node> frontier;
  
  public Node(int person) {
   this.person = person;
   minCost = Integer.MAX_VALUE;
   minPath = new LinkedList<>();
   frontier = new LinkedList<>();
  }
 }
http://ninefu.github.io/blog/PageDisplay/
  • Each page has 12 listings
  • Try to avoid listings with the same host ID in the same page
  • If the number of remaining listings is less than 12, allow duplicated host ID in the same page// not implemented?
 public static List<List<String>> displayPages(List<String> input) {
  LinkedList<List<String>> result = new LinkedList<>();
  if (input == null || input.size() == 0) return result;
  
  HashSet<String> visited = new HashSet<>();
  LinkedList<String> page = new LinkedList<>();
  Iterator<String> iter = input.iterator();
  
  while (iter.hasNext()) {
   String entry = iter.next();
   String host = entry.split(",")[0];
   if (visited.add(host)) {
    page.add(entry);
    iter.remove();
   }
   if (page.size() == 12 || !iter.hasNext()) {
    visited.clear();
    iter = input.iterator();
    if (page.size() == 12) {
     // sort the list
     result.add(new LinkedList<>(page));
     page = new LinkedList<>();
    }
   }
  }
  if (page.size() != 0) {
   result.add(page);
  }
  return result;
 }
 
 public static List<List<String>> displayFast(List<String> input) {
  List<List<String>> result = new LinkedList<>();
  if (input == null || input.size() == 0) return result;
  
  int notFullPageNumber = 0;
  HashMap<String, Integer> map = new HashMap<>(); // <host id, last inserted page index>
  for (int i = 0; i < input.size(); i++) {
   String entry = input.get(i);
   String host = entry.split(",")[0];
   int page = map.getOrDefault(host, -1);
   // never seen host id, insert into the first page that is not full
   if (page == -1) {
    if (result.size() <= notFullPageNumber) {
     result.add(new LinkedList<>());
    }
    result.get(notFullPageNumber).add(entry);
    map.put(host, notFullPageNumber);
    if (result.get(notFullPageNumber).size() == 12) {
     notFullPageNumber = findNextNotFullPage(notFullPageNumber, result);
    }
   } else {
    // duplicate id, insert into the first not-full page after the last inserted index
    int nextInsertPageNumber = findNextNotFullPage(page, result);
    if (nextInsertPageNumber == result.size() && 
      result.get(nextInsertPageNumber - 1).size() + input.size() - i > 12) {
     result.add(new LinkedList<>());
    } else if (nextInsertPageNumber == result.size()){
     nextInsertPageNumber--;
    }
    result.get(nextInsertPageNumber).add(entry);
    map.put(host, nextInsertPageNumber);
   }
  }
  return result;
 }
 
 public static int findNextNotFullPage(int currentPageNumber, List<List<String>> result) {
  int res = currentPageNumber + 1;
  while (res < result.size() && result.get(res).size() == 12) {
   res++;
  }
  return res;
 }
http://ninefu.github.io/blog/MeetingIntervals/
 * 每个subarray都已经sort好
举例:
[
  [[1, 3], [6, 7]],
  [[2, 4]],
  [[2, 3], [9, 12]].
]
返回
[[4, 6], [7, 9]]
N个员工,每个员工有若干个interval表示在这段时间是忙碌的。求所有员工都不忙的intervals
解法:这题最简单的方法就是把所有区间都拆成两个点,然后排序,然后扫描,每次碰到一个点如果
是左端点就把busy_employees加1,否则减1,等到每次busy_employees为0时就是一个新的区间。
这样复杂度O(MlogM),M是总共区间数。但是我当时也不知道是脑抽了还是脑子太好用了,弄了个堆的,
堆里N个元素,存每个员工的下一个端点,如果堆顶是某个员工的左端点就busy_employees加1,否则减1。
这样好处是时间复杂度低了一点点,坏处是给面试官讲了半天而且代码不是太好写……不建议这么做.
 * @author yihuifu
 *
 */
public class MeetingIntervals {

 public static void main(String[] args) {
  MeetingIntervals meetingIntervals = new MeetingIntervals();
  List<List<Interval>> intervals = new LinkedList<>();
  for (int i = 0; i < 3; i++) {
   intervals.add(new LinkedList<>());
   switch (i) {
    case 0: 
     intervals.get(i).add(meetingIntervals.new Interval(1,3));
     intervals.get(i).add(meetingIntervals.new Interval(6,7));
     break;
    case 1:
     intervals.get(i).add(meetingIntervals.new Interval(2,8));
     break;
    case 2:
     intervals.get(i).add(meetingIntervals.new Interval(2,3));
     intervals.get(i).add(meetingIntervals.new Interval(9,12));
     break;
   }
  }
  List<Interval> freeIntervals = meetingIntervals.findFreeIntervals(intervals);
  for (Interval interval : freeIntervals) {
   System.out.println(interval.toString());
  }
 }
 
 public List<Interval> findFreeIntervals(List<List<Interval>> intervals) {
  List<Interval> result = new LinkedList<>();
  if (intervals == null || intervals.size() == 0) {
   return result;
  }
  LinkedList<Interval> all = new LinkedList<>();
  for (int i = 0; i < intervals.size(); i++) {
   for (int j = 0; j < intervals.get(i).size(); j++) {
    all.add(intervals.get(i).get(j));
   }
  }
  Collections.sort(all, (a,b) -> (a.startTime - b.startTime));
  PriorityQueue<Interval> pq = new PriorityQueue<>((a,b) -> a.endTime - b.endTime);
  pq.offer(all.get(0));
  for (int i = 1; i < all.size(); i++) {
   Interval prev = pq.poll();
   Interval cur = all.get(i);
   if (cur.startTime <= prev.endTime) {
    prev.endTime = Math.max(prev.endTime, cur.endTime);
   } else {
    pq.offer(cur);
   }
   pq.offer(prev);
  }
  Interval prev = pq.poll();
  while (!pq.isEmpty()) {
   Interval cur = pq.poll();
   result.add(new Interval(prev.endTime, cur.startTime));
   prev = cur;
  }
  return result;
 }
 
 public class Interval {
  int startTime;
  int endTime;
  
  public Interval(int start, int end) {
   startTime = start;
   endTime = end;
  }
  
  @Override
  public String toString() {
   return "" + startTime + " " + endTime;
  }
 }

http://ninefu.github.io/blog/CIDR/
 * 输入一个ip,和一个count来表示一组ip, e.g.   7.7.7.7和3表示 7.7.7.7, 7.7.7.8, 7.7.7.9, 
 * 输出这组ip的CIDR形式.CIDR表达是: ip地址/掩码位数 表示一个区间
 * 比如 0.0.0.8 / 30 就是以0.0.0.8为准,前30位不能变--》0.0.0.(0000 10 00)--0.0.0.(0000 10 11) 
 * 然后给你一个起始ip,和数量。用最少的cidr表示这个区间
 * @author yihuifu
 
 public void getCIDRS(String binaryIP, int count, List<String> res) {
  while (count > 0) {
   int zero = 0, last = binaryIP.length() - 1;
   while (last >= 0 && binaryIP.charAt(last) == '0') {
    if (count - (int) Math.pow(2, zero + 1) >= 0) {
     zero++;
     last--;
    } else {
     break;
    }
   }
   String cidrIP = binaryToDecimal(binaryIP) + "/" + (32 - zero);
   System.out.println("Found one CIDR " + cidrIP);
   res.add(cidrIP);
   count -= (int) Math.pow(2, zero);
   binaryIP = getNextBinaryIP(binaryIP, zero);
  }
  
 }
 
 public String getNextBinaryIP(String prevIp, int lastZero) {
  System.out.println("prevIP " + prevIp);
  int one = 32 - 1 - lastZero;
  while (one >= 0 && prevIp.charAt(one) == '1') {
   one--;
  }
  StringBuilder res = new StringBuilder(prevIp.substring(0, one));
  res.append("1");
  while (res.length() < 32) {
   res.append("0");
  }
  return res.toString();
 }
 
 public String binaryToDecimal(String binaryIP) {
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i < binaryIP.length(); i += 8) {
   String subBinary;
   if (i < 24) {
    subBinary = binaryIP.substring(i, i + 8);
   } else {
    subBinary = binaryIP.substring(i);
   }
    
   Integer sub = Integer.parseInt(subBinary, 2);
   sb.append(sub);
   if (i < 24) {
    sb.append(".");
   }
  }
  System.out.println("convert " + binaryIP + " to " + sb.toString());
  return sb.toString();
 }
 
 public String decimalToBinary(String decimalIP) {
  StringBuilder sb = new StringBuilder();
  String[] ips = decimalIP.split("\\.");
  for (int i = 0; i < ips.length; i++) {
   Integer sub = Integer.parseInt(ips[i]);
   String binarySub = Integer.toBinaryString(sub);
   int missingDigit = 8 - binarySub.length();
   String zeros = "";
   while (missingDigit > 0) {
    zeros += "0";
    missingDigit--;
   }
   sb.append(zeros + binarySub);
  }
  System.out.println("convert " + decimalIP + " to " + sb.toString());
  return sb.toString();
 }

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