优步面经
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
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。
做tiny url
其实就是转换成base 62的数。
Spiral Array Print
1,Run-Length Encoding,就是把aaabbcccaaaa变成3a2b3c4a这样,要求encode后的信息要比原来的短。
首先暴力扫描之。然后问有什么问题,答曰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
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层面 – 摊手)
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);
}
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,对所有数据排序然后找中位数。
应用场景是,有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
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。
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();
}
4. design一个uber eat。说是system design结果我感觉更像product design
5. engineering manager. 一个老中 刚来没多久。问了我许多问题结果感觉对我不大满意。比如问我写service到底理解到多deep。data storage平时接触没(确实没怎么 – 都在application层面 – 摊手)