一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

一亩三分地官方iOS手机应用下载
查看: 1383|回复: 13
收起左侧

Youtube/Google 11/23电面

[复制链接] |试试Instant~ |关注本帖
xiaoniuona 发表于 2015-12-1 00:35:03 | 显示全部楼层 |阅读模式

2015(10-12月) 码农类 硕士 全职@Google - 内推 - 技术电面 |Otherfresh grad应届毕业生

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

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
挺nice的一个中国大姐,在google干了7年了~上来什么也没问直接做题
. 1point 3acres 璁哄潧
1. plus one,no negative number
2. input是一个二维char数组代表一个gym,#是wall,不能通过,*是健身器材,其他都是空格,要求找一个空格到所有*的距离最短. 1point 3acres 璁哄潧

求onsite啊!!!

评分

1

查看全部评分

queeniejing 发表于 2015-12-1 02:29:48 | 显示全部楼层
关注一亩三分地公众号:
Warald_一亩三分地
谢谢LZ 分享, 请问你的第二题是 用BFS 做吗
回复 支持 反对

使用道具 举报

hyliu0000 发表于 2015-12-1 04:39:08 | 显示全部楼层
关注一亩三分地微博:
Warald
同问第二题。  目测是建立二维数组记录, dfs or bfs, 然后遍历数组得到最小
回复 支持 反对

使用道具 举报

queqichao 发表于 2015-12-1 05:34:26 | 显示全部楼层
第二题,建立一个2d table of int,然后从每一个健身器材开始BFS,对每个非wall cell对应的table里面cell累加到起始健身器材的距离。然后扫一遍table里面所有cell,找到距离之和最小的一个。
回复 支持 反对

使用道具 举报

 楼主| xiaoniuona 发表于 2015-12-1 05:51:02 | 显示全部楼层
queeniejing 发表于 2015-12-1 02:29
谢谢LZ 分享, 请问你的第二题是 用BFS 做吗

是的,参考LC那道walls and gates,这道题就是每次bfs不是找最小距离,而是把距离加起来
求职神器indeed - 在全球最大的求职网站找找适合你的工作?
回复 支持 反对

使用道具 举报

 楼主| xiaoniuona 发表于 2015-12-1 05:51:48 | 显示全部楼层
hyliu0000 发表于 2015-12-1 04:39. 1point3acres.com/bbs
同问第二题。  目测是建立二维数组记录, dfs or bfs, 然后遍历数组得到最小

bfs,我和3楼做法差不多
回复 支持 反对

使用道具 举报

ssross 发表于 2015-12-1 10:53:20 | 显示全部楼层
xiaoniuona 发表于 2015-12-1 05:51
是的,参考LC那道walls and gates,这道题就是每次bfs不是找最小距离,而是把距离加起来

请问一下LC 那道题不是只能求每个非wall的cell到一个最近的gate的距离吗?怎么样在bfs的时候求一个cell到所有gate的累加的距离的和?
回复 支持 反对

使用道具 举报

 楼主| xiaoniuona 发表于 2015-12-2 07:21:12 | 显示全部楼层
ssross 发表于 2015-12-1 10:53. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
请问一下LC 那道题不是只能求每个非wall的cell到一个最近的gate的距离吗?怎么样在bfs的时候求一个cell到 ...

从每个gate开始bfs,到一个cell的时候,update的不是更小的距离,而是把这次的距离累加上去。等到所有bfs结束,每个cell上就是到所有gate的距离的和了
回复 支持 反对

使用道具 举报

bobzhang2004 发表于 2015-12-2 23:46:39 | 显示全部楼层
写了下代码,有个问题是当计算从*到其他地方的位置时,可以经过'*'的吗?还是需要绕开?代码为可以经过的情况
  1. public class GymAndWall {. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  2. 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  3.         public static void main(String[] args) {. 1point3acres.com/bbs
  4.                 GymAndWall gaw = new GymAndWall();
  5.                 char[][] matrix =  {{' ', ' ', ' ', ' '},
  6.                                                         {' ', '*', ' ', ' '},
  7.                                                         {' ', ' ', '*', '#'},
  8.                                                         {' ', '#', '*', ' '},};. 鍥磋鎴戜滑@1point 3 acres
  9.                 int[] res = gaw.findShortestDistance(matrix);. visit 1point3acres.com for more.
  10.                 System.out.println(res[0]);
  11.                 System.out.println(res[1]);
  12.                 // 1 2. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  13.         }
  14.        
  15.         public int[] findShortestDistance(char[][] matrix) {
  16.                 int[] res = new int[2];
  17.                 res[0] = -1;
  18.                 res[1] = -1;
  19.                 if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
    . 1point 3acres 璁哄潧
  20.                         return res;.鐣欏璁哄潧-涓浜-涓夊垎鍦
  21.                 }
  22.                 int m = matrix.length;
  23.                 int n = matrix[0].length;
  24.                 int[][] dis = new int[m][n];. From 1point 3acres bbs
  25.                 boolean[][] visited = new boolean[m][n];
  26.                 for (int i = 0; i < m; i++) {. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  27.                         for (int j = 0; j < n; j++) {
  28.                                 for (boolean[] row : visited) {
  29.                                         Arrays.fill(row, false);
  30.                                 }
  31.                                 if (matrix[i][j] == '*') {
  32.                                         bfs(matrix, i, j, dis, visited);
  33.                                 }
  34.                         }
  35.                 }
  36.                 int min = Integer.MAX_VALUE;. From 1point 3acres bbs
  37.                 for (int i = 0; i < m; i++) {
  38.                         for (int j = 0; j < n; j++) {
  39.                                 if (matrix[i][j] == ' ') {
  40.                                         if (dis[i][j] < min) {
  41.                                                 min = dis[i][j];. 1point3acres.com/bbs
  42.                                                 res[0] = i;. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  43.                                                 res[1] = j;
  44.                                         }.1point3acres缃
  45.                                 }
  46.                         }
  47.                 }
  48.                 for (int[] arr : dis) {
  49.                         for (int i : arr) {. visit 1point3acres.com for more.
  50.                                 System.out.print(i + " ");
  51.                         }
  52.                         System.out.println();. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  53.                 }
  54.                
  55.                 return res;
  56.         }

  57.         private int[] dx = {1, -1, 0, 0};
  58.         private int[] dy = {0, 0, 1, -1};
  59.         private void bfs(char[][] matrix, int i, int j, int[][] dis, boolean[][] visited) {
  60.                 if (i < 0 || i >= matrix[0].length || j < 0 || j >= matrix[0].length || matrix[i][j] == '#' || visited[i][j]) {
    . from: 1point3acres.com/bbs
  61.                         return;
  62.                 }. 1point 3acres 璁哄潧
  63.                 Queue<Integer> queue = new LinkedList<Integer>();. from: 1point3acres.com/bbs
  64.                 int len = matrix[0].length;
  65.                 int code = i * len + j;. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  66.                 visited[i][j] = true;. from: 1point3acres.com/bbs
  67.                 queue.offer(code);.鏈枃鍘熷垱鑷1point3acres璁哄潧
  68.                 int step = 0;
  69.                 while (!queue.isEmpty()) {. 1point 3acres 璁哄潧
  70.                         int size = queue.size();
  71.                         for (int k = 0; k < size; k++) {
  72.                                 code = queue.poll();
  73.                                 int x = code / len;-google 1point3acres
  74.                                 int y = code % len;. From 1point 3acres bbs
  75. //                                System.out.println(x + " " + y);
  76.                                 dis[x][y] += step;
  77.                                 for (int index = 0; index < dx.length; index++) {
  78.                                         int nx = x + dx[index];
    . Waral 鍗氬鏈夋洿澶氭枃绔,
  79.                                         int ny = y + dy[index];. From 1point 3acres bbs
  80.                                         if (nx >= 0 && nx < matrix.length && ny >= 0 && ny < matrix[0].length && !visited[nx][ny] && matrix[i][j] != '#') {
  81.                                                 queue.offer(nx * len + ny);. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  82.                                                 visited[nx][ny] = true;
  83.                                         }
  84.                                 }
  85.                         }. 1point 3acres 璁哄潧
  86.                         step++;
  87.                 }
  88.         }
  89. }.鏈枃鍘熷垱鑷1point3acres璁哄潧
复制代码

补充内容 (2015-12-2 23:47):
dfs应该不行吧,步数没法控制
回复 支持 反对

使用道具 举报

ssross 发表于 2015-12-3 03:01:35 | 显示全部楼层
自己也写了个。就是对每个‘*’进行BFS!最后把distance累加起来。. 1point 3acres 璁哄潧
  1. /*

  2. '#' stands for obstacle, ' ' is path, and '*' is target. Get one cell in the matrix except obstacles which. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  3.         has the shorest distance to all the targets.

  4.         idea: do BFS from each target and obtain the distance to all the other cells. Culmulate the sum of
  5.         distance to an overall dis matrix. The least sum would be the shortest distance cell.
  6. .鏈枃鍘熷垱鑷1point3acres璁哄潧
  7.         Time: O(k * mn) where mn is the cell numbers and k is number of targets.
  8. . from: 1point3acres.com/bbs
  9. */
  10. public class getAllShorestDist {
  11.         sprivate static final int[][] DIRECTIONS = new int[][] { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };

  12.         public static void main(String[] args) {

  13.                 char[][] matrix =  {{' ', '#', '*', ' '},. more info on 1point3acres.com
  14.                                         {' ', ' ', ' ', '#'},
  15.                                         {' ', '#', ' ', '#'},
  16.                                         {'*', '#', ' ', ' '}};
  17.                 getShortestDist(matrix);. 1point3acres.com/bbs
  18.                
  19.         }
  20. . Waral 鍗氬鏈夋洿澶氭枃绔,
  21.         public static void getShortestDist(char[][] matrix) {.鏈枃鍘熷垱鑷1point3acres璁哄潧
  22.                 if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
  23.                         return;
  24.                
  25.                 int m = matrix.length;
  26.                 int n = matrix[0].length;. visit 1point3acres.com for more.
  27.                 int[][] dis = new int[m][n];. visit 1point3acres.com for more.
  28.                 boolean[][] visited = new boolean[m][n];
  29.                 for(int i = 0; i < m; i++) {. Waral 鍗氬鏈夋洿澶氭枃绔,
  30.                         for(int j = 0; j < n; j++) {
  31.                                 for(boolean[] row : visited)
  32.                                         Arrays.fill(row, false);
  33.                                 if(matrix[i][j] == '*') {
  34.                                         int[][] curDis = new int[m][n];
  35.                                         bfs(matrix, i, j, curDis, visited);
  36.                                         sumDistance(dis, curDis, matrix); 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  37.                                 }
  38.                         }
  39.                 }
  40.                
  41.                 for(int k = 0; k < m; k++) {
  42.                         System.out.println(Arrays.toString(dis[k]));
  43.                 }
  44.         }

  45.         private static void bfs(char[][] matrix, int i, int j, int[][] curDis, boolean[][] visited) {
  46.                 Queue<int[]> queue = new LinkedList<int[]>();
  47.                 queue.offer(new int[] { i, j });. Waral 鍗氬鏈夋洿澶氭枃绔,
  48.                 visited[i][j] = true;. visit 1point3acres.com for more.
  49.                
  50.                 while(!queue.isEmpty()) {
  51.                         int[] point = queue.poll();
  52.                         int row = point[0];. Waral 鍗氬鏈夋洿澶氭枃绔,
  53.                         int col = point[1];
  54.                         for(int[] direction : DIRECTIONS) {
  55.                                 int r = row + direction[0];. From 1point 3acres bbs
  56.                                 int c = col + direction[1];
  57.                                 if(r < 0 || r >= matrix.length || c < 0 || c >= matrix[0].length ||
  58.                                                 visited[r][c] || matrix[r][c] == '#')
  59.                                         continue;
  60.                                 curDis[r][c] = curDis[row][col] + 1;
  61.                                 visited[r][c] = true;.1point3acres缃
  62.                                 queue.offer(new int[] { r, c });
  63.                         }. 1point 3acres 璁哄潧
  64.                 }. 鍥磋鎴戜滑@1point 3 acres
  65.         }

  66.         public static void sumDistance(int[][] dis, int[][] curDis, char[][] matrix) {
  67.                 for(int i = 0; i < curDis.length; i++) {
    . 1point 3acres 璁哄潧
  68.                         for(int j = 0; j < curDis[0].length; j++) {
  69.                                 if(matrix[i][j] != '#')
  70.                                         dis[i][j] += curDis[i][j];
  71.                         }. 1point 3acres 璁哄潧
  72.                 }
  73.         }
  74. }
复制代码
回复 支持 反对

使用道具 举报

bobzhang2004 发表于 2015-12-3 03:48:10 | 显示全部楼层
ssross 发表于 2015-12-3 03:01-google 1point3acres
自己也写了个。就是对每个‘*’进行BFS!最后把distance累加起来。

这代码的时间复杂度是O(n^4)?
回复 支持 反对

使用道具 举报

ssross 发表于 2015-12-3 03:52:57 | 显示全部楼层
bobzhang2004 发表于 2015-12-3 03:48
这代码的时间复杂度是O(n^4)?

没有这么大。他只从target开始bfs。每个bfs是O(n^2)所以其实总的就是O(k * n^2),k是target的数量!
回复 支持 反对

使用道具 举报

bobzhang2004 发表于 2015-12-3 06:19:57 | 显示全部楼层
ssross 发表于 2015-12-3 03:52
没有这么大。他只从target开始bfs。每个bfs是O(n^2)所以其实总的就是O(k * n^2),k是target的数量!

但是你的sumDistance(dis, curDis, matrix);,是在两重for循环中,感觉如果要做到O(k * n^2),得用hashset来保存是否访问过,因为Arrays.fill也是在三重循环中
回复 支持 反对

使用道具 举报

 楼主| xiaoniuona 发表于 2015-12-3 07:17:20 | 显示全部楼层
bobzhang2004 发表于 2015-12-2 23:46.1point3acres缃
写了下代码,有个问题是当计算从*到其他地方的位置时,可以经过'*'的吗?还是需要绕开?代码为可以经过的情 ...

不可以,要绕开*
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2017-3-24 16:50

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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