📣 VIP通行证夏日特惠 限时立减$68
回复: 37
跳转到指定楼层
上一主题 下一主题
收起左侧

狗家 匹村 现场面 面经

🔗
匿名用户-QCFSW  2018-9-22 05:16:14 |倒序浏览

2018(7-9月) 码农类General 硕士 全职@google - 内推 - Onsite  | | Other | 应届毕业生

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

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

x
总共4轮,简历一个字没问,每个面试官都是上来就出题,题目其实都不难,但是楼主是菜鸡,求各位大神指点思路。顺便求加大米。
您好!
本帖隐藏的内容需要积分高于 180 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 180 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies



补充内容 (2018-9-22 05:19):
是visited的hashSet,之前写错了,不是数组。

补充内容 (2018-9-22 05:26):
补充下第一题是横着走的, 不考虑竖着走。真的求解答,怕下次还有类似的答不上就惨了。

补充内容 (2018-9-22 05:26):
补充下第一题是横着走的, 不考虑竖着走。真的求解答,怕下次还有类似的答不上就惨了。

补充内容 (2018-9-22 07:56):

补充里面不能贴图,第一题的解释请看9楼,如果哪位大神有思路,求贴一下大家看看~感谢!

补充内容 (2018-9-23 00:08):
找到了 第4题 刷题网 齐武巴 居然是道easy

评分

参与人数 12大米 +147 收起 理由
atlantic7200 + 5 给你点个赞!
eddyzhd + 5 给你点个赞!
gaotianhang1022 + 5 给你点个赞!
qiqu + 3 给你点个赞!
reliveinfire + 5 很有用的信息!

查看全部评分


上一篇:神奇的艾比艾木 GHC Video面
下一篇:新鲜出炉的LinkedIn OA面经

本帖被以下淘专辑推荐:

  • · google|主题: 216, 订阅: 124
全局:
论坛匿名用户 发表于 2018-9-23 04:50
修机器的人每次修一列的时候,只能走到最右边再往下,或是原路返回从最左边往下,这个是面试官的要求,在 ...

那这样的话就是bfs了, 当y == 0 的时候可以向右 或者向下, 当y == col-1的时候可以向左或者向下,
当0<y<col的时候,保持原有的方向,但是当修复了坏机器,这时可以选择转向或者继续前进,
我代码的问题是我没有找到好的保存状态的办法,我既要保存位置,还有已经修复的机器,还有前进的方向,
我自己都觉得写的代码很恶

public List<int[]> ShortestPathFixMachine(int row, int col, List<int[]> machines)
        {
            HashSet<int> machineSet = new HashSet<int>();
            foreach (int[] a in machines)
            {
                machineSet.Add(a[0] * col + a[1]);
            }

            int n = machines.Count;
            Queue<Tuple<int, string,int>> queue = new Queue<Tuple<int, string,int>>();
            HashSet<Tuple<int, string,int>> visited = new HashSet<Tuple<int, string,int>>();
            if (machineSet.Contains(0))
            {
                Tuple<int, string,int> t = new Tuple<int, string,int>(0, "0",1);
                queue.Enqueue(t);
                visited.Add(t);
            }
            else
            {
                Tuple<int, string,int> t = new Tuple<int, string,int>(0, "",1);
                queue.Enqueue(t);
                visited.Add(t);

            }
            
            while (queue.Count > 0)
            {               
                Tuple<int, string,int> cur = queue.Dequeue();
               
                string[] arr = cur.Item2.Split(',');
                if (arr.Length == n)
                {
                    List<int[]> res = new List<int[]>();
                    foreach (string s in arr)
                    {
                        int pos = Int32.Parse(s);
                        res.Add(new int[]{ pos / col, pos % col});
                    }
                    return res;
                }

                HashSet<string> curState = new HashSet<string>(arr);
                int x = cur.Item1 / col, y = cur.Item1 % col;
                string state = cur.Item2;
                if (machineSet.Contains(cur.Item1) && !curState.Contains(cur.Item1.ToString()))
                {
                    if (state.Length == 0)
                        state = cur.Item1.ToString();
                    else
                       state += "," + cur.Item1;
                }
                if (y == 0)
                {
                    //move right
                    Tuple<int, string,int> tright = new Tuple<int, string,int>(cur.Item1 + 1, state,1);
                    if (!visited.Contains(tright))
                        queue.Enqueue(tright);

                    if ((x + 1) * col + y >= row * col)
                        continue;

                    //move down
                    Tuple<int, string,int> tdown = new Tuple<int, string,int>((x + 1) * col + y, state,1);
                    if (!visited.Contains(tdown))
                    {
                        queue.Enqueue(tdown);
                        visited.Add(tdown);   
                    }

                }
                else if (y == col - 1)
                {
                    //move left
                    Tuple<int, string,int> tleft = new Tuple<int, string,int>(cur.Item1 - 1, state,-1);                    

                    if (!visited.Contains(tleft))
                        queue.Enqueue(tleft);


                    if ((x + 1) * col + y >= row * col)
                        continue;

                    //move down
                    Tuple<int, string,int> tdown = new Tuple<int, string,int>((x + 1) * col + y, state,-1);
                    if (!visited.Contains(tdown))
                    {
                        queue.Enqueue(tdown);
                        visited.Add(tdown);
                    }
                }
                else
                {
                    //either left or right
                    Tuple<int, string,int> tmove = new Tuple<int, string,int>(cur.Item1 + cur.Item3, state, cur.Item3);

                    if (!visited.Contains(tmove))
                    {
                        queue.Enqueue(tmove);
                        visited.Add(tmove);
                    }

                    //state change, can change direction
                    if (state != cur.Item2)
                    {
                        Tuple<int, string, int> tmove2 = new Tuple<int, string, int>(cur.Item1 - cur.Item3, state, -cur.Item3);

                        if (!visited.Contains(tmove2))
                        {
                            queue.Enqueue(tmove2);
                            visited.Add(tmove2);
                        }
                    }

                    
                }
            }

            return null;
        }
回复

使用道具 举报

推荐
backtopeace 2018-9-28 06:28:26 | 只看该作者
全局:
第一题:如果需要返回起点而且不用一行一行修的话,我的想法是:
如果某一行从开始走到最后一个坏机器然后返回(行内来回)的长度大于col长度话,就可以尝试着找到满足同样条件的另一行做一个来回,这样的总步长(不考虑上下)就是 2 * col, 且肯定小于 2个单行内来回的长度。对于不满足此条件的行,在行内来回就是最短。如果满足条件的行数为单数的话,就意味着有一行不能pair上,此时就找不满足条件但行内来回最长的一行 然后比较这两行是走一个圈好还是各自来回好。

如果需要回到起点这个解法才成立,因为就能保证即使跳行的话上下的从上下长度为row长的两倍。

如果有人能看懂的话,请鉴定
回复

使用道具 举报

🔗
deeper99 2018-9-22 05:34:36 | 只看该作者
全局:
你第一题给的答案对吗?明显不是最短路径啊
回复

使用道具 举报

🔗
deeper99 2018-9-22 05:40:00 | 只看该作者
全局:
不考虑竖着走是什么意思啊,不能竖着走怎么到下一行啊。。。
回复

使用道具 举报

🔗
CHITYUEN 2018-9-22 05:50:04 | 只看该作者
全局:
楼主可以说一下第一题不考虑竖着走是什么意思吗,没太明白题意
回复

使用道具 举报

🔗
cai_lw 2018-9-22 06:05:32 | 只看该作者
全局:
第一题是NP的,只能暴力
回复

使用道具 举报

🔗
sfsttz 2018-9-22 06:24:57 | 只看该作者
全局:
第一题是列数显著小于行数码?
回复

使用道具 举报

🔗
lisheng1000 2018-9-22 06:41:19 | 只看该作者
全局:
楼主 第三题是要求实现areAllied(A,B) 和areAssociated(A,C)   方程嘛?
回复

使用道具 举报

🔗
lisheng1000 2018-9-22 06:47:22 | 只看该作者
全局:
这句话没看懂 呀  什么事 多于10s内  如何输出Stdout print多于10s内间隔的String
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-QCFSW  2018-9-22 07:20:59
deeper99 发表于 2018-9-22 05:40
不考虑竖着走是什么意思啊,不能竖着走怎么到下一行啊。。。

是我没讲清楚,因为technician被机器挡住,所以每次他要选择是原路返回,还是往前走,要么走到row的最右边往下,要么就做到row的最左边往下。要求返回的是修机器的顺序。
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-QCFSW  2018-9-22 07:22:29
CHITYUEN 发表于 2018-9-22 05:50
楼主可以说一下第一题不考虑竖着走是什么意思吗,没太明白题意

详情请看9楼
回复

使用道具 举报

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

本版积分规则

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