Wednesday, July 22, 2015

Google interview questions #5

REF: http://www.mitbbs.com/article_t/JobHunting/33011505.html
Google
电面了2轮,题目有:
一个grid,点代表城市,边代表道路,输入是一个起始点跟一堆destination,还有哪些
路被blocked 打印所有能到的点
DFS或BFS都可以,开2d array或hashmap存visit信息

老题,2d matrix的row跟column都是sorted, 在里面搜某个数
LC #240 Search a 2D Matrix II 

oil pipeline problem, 下面这个链接的10.3-9
http://staff.ustc.edu.cn/~csli/graduate/algorithms/book6/chap10
找median, quick select(一种是常规的random pivot select,另一种是deterministic select,见algorithm课第3周)

补充问题是如果有2根pipeline,怎么放
找1/4 和 3/4的点

------------------------------------------------------------------------------
REF:http://www.mitbbs.com/article_t/JobHunting/33012223.html
1.一个字符串,从字典查出字符串所有单词,然后怎么提升效率,比如输入
whoisbillgates,返回['who', 'is','bill','gates']
Trie
2.N*N的矩阵,M个朋友随机住在矩阵上,求聚会地点,满足所有朋友总路程最短, lg复
杂度
如果是manhattan distance,找所以点的x的median跟y的median

3.树里的所有duplicated子树,O(n)遍历一次
in order遍历,把每个node的值给串成string,只要对比string就知道有没有重复的子树

string helper(vector<TreeNode *> &rt, TreeNode *root,unordered_set<string> &dic) {
    if (root == NULL) return "$"; // special char
    string s = helper(rt,root->left,dic);
    s += root->val;
    s += helper(rt,root->right,dic);

    if (dic.find(s) != dic.end()) {
        rt.push_back(root);
    }else {
        dic.insert(s);    
    }
    
    return s;
}

vector<TreeNode *> findDup(TreeNode *root) {
    unordered_set<string> dic;
    vector<TreeNode*> rt;
    helper(rt,root,dic);
    return rt;
}


4.BST,给定一个数值,返回BST中最接近的节点, lg n
binary search
void helper(TreeNode *root,int target,int &minVal,int &found) {
    if (root == NULL) return;
    if (abs(root->val - target) < minVal) {
            minVal = abs(root->val - target);
            found = root->val;
    }
    if (root->val < target) {
        helper(root->right,target,minVal,found);
    }else {
        helper(root->left,target,minVal,found);    
    }
}

int findClosest(TreeNode *root,int target) {
    int found = 0,minVal = INT_MAX;    
    helper(root,target,minVal,found);
    return found;
}

5.Minus one
类似plus one,特殊情况:当给出的数字为0时

6.一个整数链表,返回最长连续数字长度 o(n), 例如输入[10,6,2,15,5,9,1,3,100,4
],返回6,因为1-6是连续的
LC #128 longest consecutive sequence

7.一个矩阵,矩阵中节点为一个二元组,如果当前节点为M[a][b] =(x,y),下一个访问
节点为M[a+x][b+y],求从一点出发是否可以遍历矩阵
没啥可说的,O(n^2)
bool canGoAround(vector<vector<pair<int,int> > > &matrix,int row, int col) {
    int m = matrix.size();
    int n = matrix[0].size();
    vector<vector<bool> > visit(m,vector<bool>(n,false));
    int count = m * n;
    
    while (count > 0) {
        if (row < 0 || row == m || col < 0 || col == n || visit[row][col]) {
            return false;
        }
        visit[row][col] = true;
        row += matrix[row][col].first;
        col += matrix[row][col].second;
        count--;
    }
    
    return true;
}
8.判断任意两个人是否有血缘关系,自己定义person类
bfs, 加速的话可以同时从p1,p2出发

bool ifRelated(Person *p1, Person *p2) {
    queue<Person *> que;
    unordered_set<Person*> visit;
    que.push(p1);
    
    while (!que.empty()) {
        Person *me = que.front();
        que.pop();
        if (me == p2 || me->mom == p2 || me->dad == p2) return true;
        
        if (visit.find(me->mom) != visit.end()) {
            visit.insert(me->mom);
            que.push(me->mom);
        }
        if (visit.find(me->dad) != visit.end()) {
            visit.insert(me->dad);
            que.push(me->dad);
        }
        for (Person *k : me->kids) {
            if (k == p2) return true;
            if (visit.find(k) != visit.end()) {
                visit.insert(k);
                que.push(k);
            }
        }
    }
    
    return false;
}
--------------------------------------------------------------------------------
REF http://www.mitbbs.com/article_t/JobHunting/33011907.html
1. Given a robot and a maze, the robot supports these apis: Turn left, move forward, checkIsExit
Write a program to make it move to the exit
取决于题意,可能是给定一个矩阵,那就是简单的bfs或dfs
或者没有给定矩阵,不能标记,那得用pledge algorithm
https://en.wikipedia.org/wiki/Maze_solving_algorithm
http://site.douban.com/guokr/widget/notes/1670101/note/182257056/
https://www.youtube.com/watch?v=_KxAMV-2tKU
http://cs.stackexchange.com/questions/29705/maze-solving-algorithms-pledge-algorithm


2. Design Youtube access control system, storage, scales


3. Suppose there are k threads, write a multi-thread program to make them come to deadlock, I use semaphore at first, then was asked to implement itwith countDownLatch


4. RunLength encoding, discuss various ways to minimize the encoded string under different constraints


5. Design a system to generate Ids for distributed DBs, discuss various Zookeeper patterns (leader elections etc). For a given number, how to return minimum number of squares that sums up to this number



-------------------------------------------------------------------

REF: http://www.mitbbs.com/article_t/JobHunting/33012339.html

题目:像apple tv,chrome tv之类的,用户可以搜索电影名字,但只能用remote在一

个虚拟的keyboard上搜索,只能在虚拟键盘上下左右移动。现在给定键盘如下:

a b c d e

f g h i j

k l m n o

p q r s t

u v w x y

z

如果用户要搜索电影名字为 cars,那么需要先往右走两步到c,输入enter,再往左走

两步到a,输入enter,再往下走3步往右走2步到r,输入enter,再往右走一步到s,输

入enter。现在规定L,R,U,D分部代表左,右,上,下移动一步,!代表输入enter,

那么用户动作可以表示成 RR!LL!DDDRR!R!

要求写一个函数,输入为一个string代表电影名字,输出为一个string代表用户的动作。

小印面试官,面了当天晚上给negative feedback,挂了。我面试中做的不好的是,没

有立马想到最佳solution,一开始提用bfs,被他否定后来提示下,想到用2d array坐

标,后来code写的还算顺利。但还是被小印无情的挂了。

对每个字母都坐标化,假设初始从‘a’开始
row = char / 5
col = char % 5
string helper(char move,int step) {
    string rt = "";
    for (int i = 0; i < step; i++) {
        rt += move;
    }
    
    return rt;
}

string fromOneLetterToAnother(char c1, char c2) {
    string move = "";
    int row1 = (c1 - 'a') / 5, col1 = (c1 - 'a') % 5;
    int row2 = (c2 - 'a') / 5, col2 = (c2 - 'a') % 5;
    // down
    if (row2 > row1) {
        move += helper('D',row2 - row1);
    }
    // up
    else if (row2 < row1) {
        move += helper('U',row1 - row2);
    }
    // R
    if (col2 > col1) {
        move += helper('R',col2 - col1);
    }
    // L
    else if (col2 < col1) {
        move += helper('L',col1 - col2);
    }
    
    return move;
}

string movement(string input) {
    string output = "";
    char pre = 'a';
    
    for (int i = 0; i < input.length(); i++) {
        output += fromOneLetterToAnother(pre,input[i]) + "!";
        pre = input[i];
    }
    
    return output;
}

----------------------------------------------------------------------------------------------

REF: http://www.mitbbs.com/article_t/JobHunting/32933923.html
1. Wildcard match
LC原题

2. http://www.fgdsb.com/2015/01/25/peek-iterator/类似。写一个de duplicator,wrap 几个stream,输出的stream全是不重复数字。
hash所有输出的结果
class It{
public:
    It(vector<int> &data) {
        ptr = 0;
        this->data = data;
    }
    It() {}
    
    bool has_next() {
        return ptr < data.size();
    }
    int get_next() {
        int rt = data[ptr];
        ptr++;
        return rt;
    }

private:
    vector<int> data;
    int ptr;
};

class Deduplicator{
public:    
    Deduplicator(vector<int> &data) {
        it = It(data);
    }

    int get_next() {   
        if (!st.empty()) {
            int rt = st.top();
            st.pop();
            return rt;
        }
        
        if (!has_next()) {
            return -1;    
        }
        int rt = st.top();
        st.pop();
        return rt;
    }

    bool has_next() {
        if (!st.empty()) {
            return true;
        }
        
        if (!it.has_next()) return false;
        int rt = it.get_next();
        while (dic.find(rt) != dic.end()) {
            if (it.has_next()) {
                rt = it.get_next();
            }else {
                return false;    
            }
        }
        dic.insert(rt);
        st.push(rt);
        return true;
    }

    
private:
    It it;
    unordered_set<int> dic;
    stack<int> st;
};

3. 求一个stream,出现次数最多的数字。然后扩展到N个machine的情况。
系统设计题
#1 储存:单机存不下,有一个(或多个)master专门用来收数字,然后分发到N个机子上,
也可以是环状结构(类似consistent hashing),各机器自己处理接受,然后发到其他机器
#2 计算:各机器自己计算,汇报给其中一台

4. 假设某个company在不同国家都有office,每个国家的office,如果是当地的假期,
就可以放假了。假设可以查询任意航班的信息,每个星期只能呆在一个地方,只有周末
的时候才能飞去别的国家。找一个放假天数最多的schedule。
这题够开放!
假期,输入可为:n个国家 of 54周 of 假期个数
航班,输入可为:54个n * n 2d数组
对每个国家的星期按假期数量排序,按dfs或bfs走都可,每条path都要走一遍才能得出最多假期

输出为一个path

5. LRU + 一些 C++问题。
LC原题

6. 这题记不大清楚了。好像是Longest increasing consecutive sequence, 然后一
个Tree的该进版。求longest increasing consecutive path。
Longest Increasing Continuous subsequence
Longest Increasing Continuous subsequence II 2d数组
Longest Increasing Subsequence


7. file system design。就是设计一个大数据的存取问题。存在disk上。我就是
partition + hash + cache那一套糊弄过去了。

No comments:

Post a Comment