回复: 31
跳转到指定楼层
上一主题 下一主题
收起左侧

帮朋友发google onsite面经

全局:

2016(1-3月) 码农类General 本科 全职@google - 内推 - Onsite  | | Other | 在职跳槽

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
1
lc 66, 原题 Plus One

2
1)
Unique Paths 变体
m * n的矩阵, 每一格有一个数字
求从左上角到右下角,和最大的路径
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
(print)

一共四轮,有一轮半是工作经验,自我介绍,项目和behavior。

评分

参与人数 1大米 +15 收起 理由
pengzewen37 + 15 感谢分享!

查看全部评分


上一篇:Facebook 二面
下一篇:Google onsite

本帖被以下淘专辑推荐:

推荐
163 2016-1-11 01:51:25 | 只看该作者
全局:
我觉得我的这个dp应该是work了,结果有701149020种(7亿种,确实很多)。不过是秒出的结果。所以应该是work了
code如下:

int count(int n) {
    map<vector<int>, int> countMap;
    countMap[vector<int>(n, 0)] = 1;
    for (int i = 1; i <= n * n; i++) {
        map<vector<int>, int> newCountMap;
        for (auto cur : countMap) {
            vector<int> curVec = cur.first;
            int curCount = cur.second;
            for (int j = 0; j < n; j++) {
                if ((j == 0 || curVec[j] < curVec[j - 1]) && curVec[j] < n) {
                    curVec[j]++;
                    newCountMap[curVec] += curCount;
                    curVec[j]--;
                }
            }
        }
        countMap = newCountMap;
    }
    return countMap.begin()->second;
}

解释一下:这里是逐个填入1到25的,dp是用在了 “只考虑count,不记录结果” 这一点上面。其中countMap是一个把vector映到int的map,vector就表示当前的选取方法,而int是选取方法对应的count数,
比如vector是 [4,3,2,1,1] 就表示第一行填了前4个,第二行填了前三个这样这样。(因为4+3+2+1+1=11,所以当前一定是在处理i=11这个数)每次一个大循环的loop结束后,newCount里面就存了填入第i个数后,所有的填法以及每个填法对应的count。所有可能的状态数大概是 5! 种(也就是非严格单减序列的个数,比 5!稍多,不过差不太多,)每个状态数会用常数时间(严格来说是 O(5))处理,所以整体的时间比最终的结果数小很多。

评分

参与人数 1大米 +10 收起 理由
cjlm007 + 10 感谢分享!

查看全部评分

回复

使用道具 举报

推荐
Effiel 2016-4-30 11:11:38 | 只看该作者
全局:
bobzhang2004 发表于 2016-2-4 11:43
不太懂c++ code,这个countMap对应的是java中的hashmap? 那vector是array, 如果这样的话这key有点奇怪啊

Java版,楼主的算法,比楼主的长很多,因为JAVA的数组的相等不是比值,

        public int count(int n) {
                Map<List<Integer>, Integer> countMap = new HashMap<>();
                countMap.put(new ArrayList<>(), 1);
                for (int i = 0; i < n * n; i++) {
                        Map<List<Integer>, Integer> newCountMap = new HashMap<>();
                        for (Map.Entry<List<Integer>, Integer> entry : countMap.entrySet()) {
                                List<Integer> currList = entry.getKey();
                                int currCount = entry.getValue();
                                for (int j = 0; j < currList.size(); j++) {
                                        if ((j == 0 || currList.get(j) < currList.get(j - 1)) && currList.get(j) < n) {
                                                List<Integer> newList = new ArrayList<>(currList);
                                                newList.set(j, newList.get(j) + 1);
                                                addToNewMap(newCountMap, currCount, newList);
                                        }
                                }
                                if (currList.size() < n) {
                                        List<Integer> newList = new ArrayList<>(currList);
                                        newList.add(1);
                                        addToNewMap(newCountMap, currCount, newList);
                                }
                        }
                        countMap = newCountMap;
                }
                return countMap.entrySet().iterator().next().getValue();
        }

        private void addToNewMap(Map<List<Integer>, Integer> newCountMap, int currCount, List<Integer> newList) {
                if (newCountMap.containsKey(newList)) {
                        newCountMap.put(newList, newCountMap.get(newList) + currCount);
                } else {
                        newCountMap.put(newList, currCount);
                }
        }

补充内容 (2016-4-30 11:19):
不是楼主, 是163
回复

使用道具 举报

全局:
163的记录状态方法好好用 也写了两个人走grid的那题

def twoPeoplePath(grid):
        m, n = len(grid), len(grid[0])
        # positions of two people and max gain
        dic = {(0, 0): grid[0][0]}
        for i in range(m + n - 2):
                newDic = {}
                for state in dic:
                        a, b = state
                        x1, y1 = a / n, a % n
                        x2, y2 = b / n, b % n
                        for i1, j1 in (x1 + 1, y1), (x1, y1 + 1):
                                if -1 < i1 < m and -1 < j1 < n:
                                        for i2, j2 in (x2 + 1, y2), (x2, y2 + 1):
                                                if -1 < i2 < m and -1 < j2 < n:
                                                        newState = (i1 * n + j1, i2 * n + j2)
                                                        total = dic[state] + grid[i1][j1] + (0 if i1 == i2 and j1 == j2 else grid[i2][j2])
                                                        if newState not in newDic:
                                                                newDic[newState] = total
                                                        else:
                                                                if newDic[newState] < total:
                                                                        newDic[newState] = total
                dic = newDic
        return dic[dic.keys()[0]]
回复

使用道具 举报

🔗
xiaobao9 2016-1-9 14:39:10 | 只看该作者
全局:
请问LZ, "给一个5*5的矩阵, 把数字1到25填进不同的格子, 要求相同行相同列的数字递增"有什么解法?
回复

使用道具 举报

🔗
ninacc 2016-1-10 13:55:22 | 只看该作者
全局:
同问第二题的5*5 矩阵的方法,谢谢 ~~~
回复

使用道具 举报

🔗
tltzhsajsdr 2016-1-10 14:49:36 | 只看该作者
全局:
刚开始以为第二题是个递归题和八皇后差不多
写了一个递归dfs的,跑了不到10分钟跑出30多万个解,完全吓尿了。。
这题一定有dp解,但我还没想出来
回复

使用道具 举报

🔗
ninacc 2016-1-10 14:59:16 | 只看该作者
全局:
tltzhsajsdr 发表于 2016-1-10 01:49
刚开始以为第二题是个递归题和八皇后差不多
写了一个递归dfs的,跑了不到10分钟跑出30多万个解,完全吓尿 ...

艾玛 dfs+backtracking 结果7亿多个解法。。。。醉了
回复

使用道具 举报

🔗
redkaras 2016-1-10 16:09:12 | 只看该作者
全局:
这个题暴力dfs的话不可行, 需要剪枝。
dfs满足两个条件
1、 1到25逐个填入值
2、 当前行的个数不能大于上一行

评分

参与人数 1大米 +10 收起 理由
cjlm007 + 10 回答的很好!

查看全部评分

回复

使用道具 举报

🔗
fatalme 2016-1-10 22:35:12 | 只看该作者
全局:
我怎么觉得他的onsite怎么这么难呢?
回复

使用道具 举报

🔗
163 2016-1-11 00:53:08 | 只看该作者
全局:
redkaras 发表于 2016-1-10 16:09
这个题暴力dfs的话不可行, 需要剪枝。
dfs满足两个条件
1、 1到25逐个填入值

问题是,如果解法本身就有几十万种甚至几亿种,那你再怎么剪枝也没用啊。
回复

使用道具 举报

🔗
163 2016-1-11 00:57:08 | 只看该作者
全局:
我好像想到一个dp的解法,等下试试看work不。
回复

使用道具 举报

🔗
163 2016-1-11 01:01:54 | 只看该作者
全局:
第一题的follow up 怎么做?
有假定说每个格子里的数字都是非负的吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表