1.
input string:“+++–++-+”
游戏规则:每人每次可以 flip “++” to “–”(必须是相邻的)
第一问:generate all possible moves
第二问:determine if this player can will. 下一步没有连续的++
2.
1.先写反转链表,然后第二题把链表变成a1->an->a2->an-1
2.第一题是path sum难度一样的dp水果。 第二题给画布上的几个线段,问怎么画最快(移动画笔会浪费时间)
solution: 线段作为vertex,端点之间的连线是edge,转化成tsp问题
3.给一个字符串,问可否组成一个新串使得每两个相邻字符不重复
**solution:**O(n!)
4.先问简历,然后又是一个path sum难度一样的dp水果
5.扫雷
solution:
set mines,其他counter=0, 然后对每个mine周围的counter++.
click: if mine, lose. if empty, show counters and run dfs 打开连通分支
mark a flag: nothing happens
2 layers: UI + matrix
3.设计一个电话本系统,实现三个功能:查找号码 boolean isTaken(),添加号码 void takeNumber(),返回一个不在电话本里的没人用的号码 number giveMeANumber()。我一开始说用HashMap,这样前两个函数的复杂度都是O(1),第三个是O(n)。面试官说能不能优化第三个函数,我说用BST,每个节点多存一个value记录这个节点下还有几个available的号码,giveMeANumber()的实现只要沿着value>0的node往下找就行了。这样三个函数的复杂度都是O(lgn).
- 要从server A 到 server B 备份很大的文件,网速很慢,文件改动很小, 用rsync: delta更新
5.
1.Word abbreviation,
e.g. Between=>b5n, friend=>f4d
Follow-up: implement
Bool checkduplicate(string [] dict, string word).1point3acres缃�
E.g. {feed }, feed => false; {door }, deer =>true; {dare}, deer => false
如果dict里有word 和input word的abbreviation 一样,则return true
follow up:如果调用很多次。 用hashmap<abbreviation, list<string>>
2.Given a list of words, find two strings S & T such that:
a. S & T have no common character. From 1point 3acres bbs
b. S.length() * T.length() is maximized
Follow up: how to optimize and speed up your algorithm
6.
onsite面了四轮,
设计random queue(面经题!!),follow-up,设计支持权重的random queue, 这一轮对复杂度的计算很多
第二轮,面经题,返回一个整数的平方和表示,使得个数最小。
第三轮,三道leetcode变种。返回二叉树的最小深度;抢银行的新题,一个数组不能连续访问两个相邻的数字,求和的最大值;求rotated sorted数组的最小值。这一轮比较开心。。
第四轮,我靠题目就是设计一个RMQ(http://en.wikipedia.org/wiki/Range_minimum_query) (我也是后来才知道这是RMQ的)。
solution:http://dongxicheng.org/structure/lca-rmq/
预处理空间+时间 O(nlgn), 查询O(1)
第一轮,给一个字符串数组,找出这样的字符串对(str1,str2),使得1,两个字符串不包含一样的字符,2. 长度乘积最大。我一开始对面试官说O(n^2)比较intuitive,然后写完了之后让我改进,后来想了一个按长度先排序,然后设置两个指针慢慢移动,估计会好很多。.
第二轮,偏向c++功底跟concurrency。实现memcopy,还有就是实现一个银行的类里面的几个算法,都很简单,但是对多线程调用的加锁需要有了解。最后又问了一个实现每次调用,运行5秒,期间不停循环自增的简单算法,follow-up是如何应对系统管理员尴尬地恰巧在这段时间内改了系统时间。
7.
1. 2个string排序,加special case 比如 ‘ch’ 在’k’之前‘j’之后.
2. 电话本。 用trie+count, 新号码沿着count>0的路走就行
3. string[]. 找2个没有common letter的string ,length乘积最大。
solution: new BitSet(26). 然后set(digit-‘0’). 比较用 bitset1.and(bitset2)==0.
维护hashmap<bitset, list<string>>, 和top1, top2.每次更新hashmap的时候,如果有list size超过了top2, 更新top1,top2.
或者直接用a2b3c4d1…
8.
1.Encode: helll=> he3xl, decode
Requirements:1. Decode(encode(s))==s; 2. Shortest length
2. Poland operation list convert to tree
E.g. {push 4, push 5, add, push 9, mul, sqrt} => tree: {sqrt, {mul,{9, add(4,5)}}}
solution:从左向右遍历逆波兰式,每个元素建一个treenode, 如果是number,treenode入栈,如果是op, pop2个成为左右子treenode(一元操作符pop一个),再入栈
9.
1.韩国人,很NICE,谈得挺开心,上来先BEHAVIORAL,然后问了一堆小问题,比如如何generate unique id,如何SCALE KEY-VALUE STORAGE.
2.好像是美国人,考了READ1024-CALL MULTIPLE TIMES , 由于OJ上要收钱,没看,CODE写的一塌糊涂。
/* The read4 API is defined in the parent class Reader4.
int read4(char[] buf); */
public class Solution extends Reader4 {
* @param buf Destination buffer
* @param n Maximum number of characters to read
* @return The number of characters read
*/
public int read(char[] buf, int n) {
char[] buffer = new char[4];
int readBytes = 0;
boolean eof = false;
while (!eof && readBytes < n)
{
int sz = read4(buffer);
if (sz < 4) eof = true;
int bytes = Math.min(n - readBytes, sz);
System.arraycopy(buffer, 0, buf, readBytes, bytes); // src, srcPos, dest, destPos, length;
readBytes += bytes;
}
return readBytes;
};
}
3.国人姐姐,很NICE,中间开始讲中文,考了CELEBRITY FINDING,CODE在引导之下写出WORST CASE O(N),表现的也差强人意。
4.美国人带SHADOW,上来考了个CUP装水的问题,FOUNTAIN MACHINE有不同的optION对应不同出水量,出水量是个RANGE,CUP VOLUME也是RANGE,求可能的SEQUENCE,简单RECURSION搞定。
然后考了TWITTER FEED的设计,答得不好,后来网上找好像需要用到PUB/SUB的概念,但是还是没找到好的REFERENCE,希望有高人有LINK或者给我解释下。
5.美国人,考了POW和找H-INDEX,最后H-INDEX勉强写出O(N),发挥的还行吧。
solution
rivate static int GetHIndex(int[] m)
{
int[] s = new int[m.Length + 1];
for (int i = 0; i < m.Length; i++) s[Math.Min(m.Length, m[i])]++;
int sum = 0;
for (int i = s.Length - 1; i >= 0; i--)
{
sum += s[i];
if (sum >= i)
return i;
}
return 0;
}

被折叠的 条评论
为什么被折叠?



