123
返回列表 发新帖
楼主: 匿名
跳转到指定楼层
上一主题 下一主题
收起左侧

黑车二面

🔗
飞天sb飞翔 2018-11-27 13:32:49 | 只看该作者
全局:
楼主,我没觉得bfs有什么问题。。不知道你面试官怎么回事。。我祝福好运。
不过我想到一个问题是bfs 是不是要用一个visited 数组,如果visited了的东西,我们就不要再去visited了呀
回复

使用道具 举报

🔗
suntopia 2018-11-27 15:43:50 | 只看该作者
全局:
如果不用BFS的话,我似乎想到一个解,复杂度应该没区别,但是更直观一些(如果面试官只看过标准答案的话是不容易再去想BFS?)

先找目标位置(x,y)的同行同列上下左右最远的四个X,如果都能找到的话,从目标行开始往上一行一行扫描,找到相距最远的一个X pair(假设允许一群O中间出现多余的X,否则找最近的跨越坐标x的pair),他们中间的interval不能有“.”且必须跟之前刚扫过那一行有intersect(如果有一个X位于坐标x,搜索结束)。同理再往下扫直到结束。如果所有行都扫完还没结束就是false


补充内容 (2018-11-27 15:57):
这样做的前提是在xy轴方向是简单变化的图形。。连通器那种复杂的形状只能遍历lol
回复

使用道具 举报

🔗
thuxx 2018-12-11 02:15:29 | 只看该作者
全局:
  1. import java.io.*;
  2. import java.util.*;

  3. class Solution {
  4.     int[] dx = {0, 0, 1, -1};
  5.     int[] dy = {1, -1, 0, 0};
  6.     public boolean isCaptured(int x, int y, char[][] board) {
  7.         if(x < 0 && y < 0 && x >= board.length && y >= board[0].length) {
  8.             return false;
  9.         }
  10.         if(board[x][y] != 'O') {
  11.             return false;
  12.         }

  13.         int rows = board.length;
  14.         int cols = board[0].length;
  15.         Set<Integer> visited = new HashSet<>();
  16.         Deque<Integer> queue = new ArrayDeque<>();
  17.         queue.offer(x * cols + y);
  18.         visited.add(x * cols + y);
  19.         while(!queue.isEmpty()) {
  20.             int point = queue.poll();
  21.             for(int i = 0; i < 4; i++) {
  22.                 int px = point / cols + dx[i];
  23.                 int py = point % cols + dy[i];
  24.                 if(px < 0 || py < 0 || px >= rows || py >= cols) {
  25.                     // not surrounded by 'X'
  26.                     return false;
  27.                 } else {
  28.                     if(board[px][py] != 'X' && visited.add(px * cols + py)) {
  29.                         queue.offer(px * cols + py);
  30.                     }
  31.                 }
  32.             }
  33.         }

  34.         return true;
  35.     }

  36.     public static void main(String[] args) {
  37.         Solution s = new Solution();
  38.         char[][] board = {
  39.             {'.', '.', 'X', 'X', '.'},
  40.             {'.', 'X', 'O', 'O', 'X'},
  41.             {'.', 'O', 'X', 'O', 'X'},
  42.             {'X', 'X', 'O', 'X', 'O'},
  43.             {'.', '.', 'X', 'X', 'O'}};
  44.         char[][] board2 = {
  45.             {'.', '.', 'X', 'X', '.'},
  46.             {'.', 'X', '.', 'O', 'X'},
  47.             {'X', '.', 'O', '.', 'X'},
  48.             {'X', 'X', '.', 'X', '.'},
  49.             {'.', '.', 'X', '.', '.'}};
  50.         for(int i = 0; i < board.length; i++) {
  51.             for(int j = 0; j < board[0].length; j++) {
  52.                 System.out.print(s.isCaptured(i, j, board2) + ", ");
  53.             }
  54.             System.out.println();
  55.         }
  56.     }
  57. }
复制代码
回复

使用道具 举报

🔗
thuxx 2018-12-11 04:11:00 | 只看该作者
全局:
  1. import java.io.*;
  2. import java.util.*;

  3. class Solution {
  4.     int[] dx = {0, 0, 1, -1};
  5.     int[] dy = {1, -1, 0, 0};
  6.    
  7.     public boolean isCaptured(int x, int y, char[][] board) {
  8.         if(x < 0 && y < 0 && x >= board.length && y >= board[0].length) {
  9.             return false;
  10.         }
  11.         if(board[x][y] != 'O') {
  12.             return false;
  13.         }

  14.         // copy original data so that keep original board unchanged
  15.         char[][] copy = new char[board.length][board[0].length];
  16.         for(int i = 0; i < board.length; i++) {
  17.             for(int j = 0; j  < board[0].length; j++) {
  18.                 copy[i][j] = board[i][j];
  19.             }
  20.         }
  21.         return helper(x, y, copy);
  22.     }

  23.     private boolean helper(int x, int y, char[][] board) {
  24.         if(x < 0 || y < 0 || x >= board.length ||  y >= board[0].length) {
  25.             return false;
  26.         }
  27.         if(board[x][y] =='X') {
  28.             return true;
  29.         }

  30.         board[x][y] = 'X';
  31.         boolean isCaptured = true;
  32.         for(int i = 0; i < 4; i++) {
  33.             isCaptured &= helper(x + dx[i], y + dy[i], board);
  34.         }
  35.         return isCaptured;
  36.     }

  37.     public static void main(String[] args) {
  38.         Solution s = new Solution();
  39.         char[][] board = {
  40.             {'.', '.', 'X', 'X', '.'},
  41.             {'.', 'X', 'O', 'O', 'X'},
  42.             {'.', 'O', 'X', 'O', 'X'},
  43.             {'X', 'X', 'O', 'X', 'O'},
  44.             {'.', '.', 'X', 'X', 'O'}};
  45.         char[][] board2 = {
  46.             {'.', '.', 'X', 'X', '.'},
  47.             {'.', 'X', '.', 'O', 'X'},
  48.             {'X', '.', 'O', '.', 'X'},
  49.             {'X', 'X', '.', 'X', '.'},
  50.             {'.', '.', 'X', '.', '.'}};
  51.         for(int i = 0; i < board.length; i++) {
  52.             for(int j = 0; j < board[0].length; j++) {
  53.                 System.out.print(s.isCaptured(i, j, board2) + ", ");
  54.             }
  55.             System.out.println();
  56.         }
  57.     }
  58. }
复制代码


DFS还要修改棋盘,感觉没BFS好
回复

使用道具 举报

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

本版积分规则

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