查看: 1009| 回复: 8
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Java/C#] 200题答案有错,求debug

全局:

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

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

x
本帖最后由 zurich.hill 于 2020-9-22 03:51 编辑

求debug。感谢  (可以运行但是答案是错的)

顺便求一粒米看面镜~~~


  1. class Solution {
  2.    
  3.     int count = 0;
  4.    
  5.     int[][] dirs = {{0,1},{0,-1},{1,0},{-1,0}};
  6.    
  7.     public int numIslands(char[][] grid) {
  8.         
  9.         int r = grid.length;
  10.         int c = grid[0].length;
  11.          
  12.         for(int m = 0; m < r; m++)
  13.             for(int n = 0; n < c; n++)
  14.                     if(  grid[m][n] == '1' ) {
  15.                         
  16.                         System.out.println("we found one island!!");
  17.                         
  18.                         count++;
  19.                         
  20.                         bfs(grid, m, n, r, c);
  21.                     }   
  22.         
  23.         return count;
  24.     }
  25.    
  26.     public void bfs(char[][] grid, int i, int j, int r, int c) {
  27.         
  28.         Queue<int[]> q = new LinkedList<int[]>();
  29.         
  30.         q.add(new int[]{i,j});
  31.       
  32.         while(!q.isEmpty()){
  33.             
  34.                 int[] curr = q.poll();

  35.                 grid[ curr[0] ][ curr[1] ] = '0';

  36.                 for(int[] dir : dirs) {

  37.                     int ii = i + dir[0];
  38.                     int jj = j + dir[1];

  39.                     if( ii>=0 && ii < r && jj>=0 && jj < c && grid[ii][jj] == '1' ){
  40.                         
  41.                         System.out.println("we add into queue = " + ii + "   " + jj  +  "  <--    " + i + "    " + j   );
  42.                         q.add(new int[]{ii,jj});
  43.                     }
  44.                 }
  45.         }        
  46.     }   
  47. }
复制代码

评分

参与人数 1大米 +2 收起 理由
我就是尼采 + 2 报什么错啊

查看全部评分


上一篇:求指导,duplicate subarray(一道codesignal的OA题)
下一篇:求wustl的朋友一起subscribe leetcode
推荐
zea7ot 2020-9-22 08:23:03 | 只看该作者
全局:
这个解逻辑上的错误在40、41两行。这个错误我也会犯lol。
我建议使用单独的变量明示。比如:
1. 不要图省事直接使用cur[0]/cur[1](实际上也没有特别省事)。而使用: <code>int row = cur[0]; int col = cur[1];</code>明示。新的坐标使用新的变量明示:<code>int r = row + dirs[0]; int c = col + dirs[1]</code>。这样比较不容易犯错。
2. 个人觉得:使用的变量的名称,有些不习惯。比如避免使用单字母的变量(q -> queue),使用row/col代替i/j, r(nr)/c(nc)代替ii/jj等。这可能是一个个人习惯的问题。
回复

使用道具 举报

推荐
crest300 2020-9-22 05:29:26 | 只看该作者
全局:
三个问题:1. 应该在入队之前标记visited,不然会重复入队。2. 40行改成int ii = curr[0] + dir[0]; 41行同理。 3. 缺少边界条件判断。
两个建议: 1. 建议楼主弄懂每个算法具体原理再做题。 2. 不要生搬硬套模板,要弄懂每一行代码都是做什么的,写完之后自己按照自己写的代码手动在纸上跑一遍。

评分

参与人数 1大米 +2 收起 理由
格林匹施ZELQ + 2 欢迎分享你知道的情况,会给更多积分奖励!

查看全部评分

回复

使用道具 举报

🔗
 楼主| zurich.hill 2020-9-22 08:00:17 | 只看该作者
全局:
crest300 发表于 2020-9-22 05:29
三个问题:1. 应该在入队之前标记visited,不然会重复入队。2. 40行改成int ii = curr[0] + dir[0]; 41行同 ...

万分感谢!!!!!!!!!!
回复

使用道具 举报

🔗
zea7ot 2020-9-22 08:18:52 | 只看该作者
全局:
crest300 发表于 2020-9-22 05:29
三个问题:1. 应该在入队之前标记visited,不然会重复入队。2. 40行改成int ii = curr[0] + dir[0]; 41行同 ...

感谢回答,我有些小疑问。还请多多指教:
这题目,只会把是1的点(岛)放入队列,出队后再标记为0。逻辑上应该不会出现重复加入队列的情况。
不过我同意:常规BFS应该在进队列的时候进行标记。相比较而言,Djikstra's Algorithm是出队列的时候进行标记。

我也不太董这里说的"缺少边界判断"是什么意思。43行不算么?
回复

使用道具 举报

🔗
 楼主| zurich.hill 2020-9-22 11:07:16 | 只看该作者
全局:
debug结束了,通过了



  1. class Solution {
  2.    
  3.     int count = 0;
  4.    
  5.     int[][] dirs = {{0,1},{0,-1},{1,0},{-1,0}};
  6.    
  7.     public int numIslands(char[][] grid) {
  8.         
  9.         if(grid.length == 0) return 0;
  10.         
  11.         int r = grid.length;
  12.         int c = grid[0].length;
  13.          
  14.         for(int m = 0; m < r; m++)
  15.             for(int n = 0; n < c; n++)
  16.                     if(  grid[m][n] == '1' ) {
  17.                        
  18.                         count++;
  19.                         
  20.                         bfs(grid, m, n, r, c);
  21.                     }   
  22.         
  23.         return count;
  24.     }
  25.    
  26.     public void bfs(char[][] grid, int i, int j, int r, int c) {
  27.         
  28.         Queue<int[]> q = new LinkedList<int[]>();
  29.         
  30.         q.add(new int[]{i,j});
  31.         
  32.         grid[ i ][ j ] = '0';
  33.       
  34.         while(!q.isEmpty()){
  35.             
  36.                 int[] curr = q.poll();
  37.             
  38.                 grid[ curr[0] ][ curr[1] ] = '0';

  39.                 for(int[] dir : dirs) {

  40.                     int ii = curr[0] + dir[0];
  41.                     int jj = curr[1] + dir[1];

  42.                     if( ii>=0 && ii < r && jj>=0 && jj < c && grid[ii][jj] == '1' ){
  43.                         
  44.                         q.add(new int[]{ii,jj});
  45.                         grid[ii][jj] = '0';
  46.                     }
  47.                 }
  48.         }        
  49.     }   
  50. }
复制代码


回复

使用道具 举报

🔗
ygmm 2020-9-23 11:23:25 | 只看该作者
全局:
                    int ii = i + dir[0];
                    int jj = j + dir[1];

这里错了, i, j 不是当前queue弹出来的那个坐标了
回复

使用道具 举报

🔗
ygmm 2020-9-23 11:27:14 | 只看该作者
全局:
crest300 发表于 2020-9-22 05:29
三个问题:1. 应该在入队之前标记visited,不然会重复入队。2. 40行改成int ii = curr[0] + dir[0]; 41行同 ...

确定有这2个问题吗?

把值从1改成0(就是相当于visited flag),就是防止重复入队
边界也有判断,在入队的时候
回复

使用道具 举报

🔗
crest300 2020-9-23 14:38:52 | 只看该作者
全局:
ygmm 发表于 2020-9-23 11:27
确定有这2个问题吗?

把值从1改成0(就是相当于visited flag),就是防止重复入队

您可以尝试提交一下楼主最开始没改过的代码哦,谢谢亲~~
回复

使用道具 举报

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

本版积分规则

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