1

我坚持这种方法。

public class Duplicate{


   public static boolean extra(int [][] grid)
   {
       for(int i = 0; i < grid.length; i++)
           for(int j = 0; j < grid[i].length-1; j++)
              if(grid[i][j] == grid[i][j+1])
              {
                  System.out.println(grid[i][j]);
                  return true;
              }
    return false;
   }

   public static void main(String[] args){

      int [][] grades = {{3,5,8,7},
                        {2,1,11,4},
                       {13,20,10,6},
                        {7,0,12,15}
                       };

       System.out.print(extra(grades));   
   }
 }

我想查找数组中是否有任何重复的整数。如果存在并且重复的 int,则返回 true。我的方法不断出现错误。我究竟做错了什么?任何帮助,将不胜感激。谢谢,麻烦您了。

4

4 回答 4

2

您所做的所有方法都是检查两个连续元素是否相等,这不会告诉您有关不相邻的重复项的任何信息。一种方法是将Map<Integer, Integer>值映射到它们的频率:

Map<Integer, Integer> map = new HashMap<>();

for (int[] row : grid) {
    for (int a : row) {
        map.put(a, map.containsKey(a) ? map.get(a) + 1 : 1);
    }
}

然后,您可以遍历此映射的条目以查找频率大于或等于 2 的元素。

于 2013-10-10T02:31:26.607 回答
2

要重写您的方法以使其正常工作:

ArrayList<Integer> comeBefore = new ArrayList<Integer>();
for(int i = 0; i < grid.length; i++) {
    for(int j = 0; j < grid[i].length; j++) {
        if(comeBefore.contains(grid[i][j])) {
            System.out.println(grid[i][j]);
            return true;
        }
        comeBefore.add(grid[i][j]);
    }
}
return false;

我现在没有时间考虑它......但也许一个集合或这样的数据结构将是一个更有效的数据结构。此外,这段代码可能不正确......但它是它的要点;它未经测试。

于 2013-10-10T02:38:47.347 回答
1
private static boolean extra(int[][] data) {
    Set<Integer> set = new HashSet<Integer>();
    for (int i = 0; i < data.length; i++) {
        for (int j = 0; j < data[i].length; j++) {
            if (set.contains(data[i][j])) {
                return true;
            } else {
                set.add(data[i][j]);
            }
        }
    }
    return false;
}
于 2013-10-10T02:41:09.867 回答
1

您只是将循环中的相邻数字与此行进行比较if(grid[i][j] == grid[i][j+1])

就像提到的 arshajii 一样,使用 Map will 是执行此操作的一种方法。如果您想保留每个重复项的坐标,那么您可以扩展 arshajii 的答案以获得这样的列表地图。

Map<Integer, List<Point>> map = new HashMap<>();

for(int i = 0; i < grid.length; i++)
{
    for(int j = 0; j < grid[i].length; j++)
    {
        int val = grid[i][j];
        if(map.containskey(val))
             map.put(val, map.get(val).add(new Point(i,j));
        else
        {
             List<Point> li = new ArrayList<>();
             li.add(new Point(i,j));
             map.put(val, li);
        }
    }
}

然后要获得重复项,您可以找到任何大小 > 1 的键,您可以获得坐标

for(Integer key : map.ketSet())
{
     List<Point> li = map.get(key);
     if(li.size() > 1)
     {
          System.out.println("The value " + key +" was duplicated at the indices: ");
          for(Point p : li)
             System.out.println(p.x + ", " + p.y);
     }
}

但这可能已经过头了!

于 2013-10-10T02:48:57.143 回答