google 面经

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).

  1. 要从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的)。
solutionhttp://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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值