java - 数独 - 如何检查行、列、子方 block 中的重复项?

标签 java

因此,我正在尝试创建一个包含整数 1-9 的列表,该列表旨在用于检查以下内容:

  • 对于每一行(如果包含重复项)
  • 对于每列(如果包含重复项)
  • 对于 9x9 网格内的每个 3x3 正方形(如果包含重复项)

但是,我不太确定如何去做。最初我的方法会检查 1-9,但不会检查重复项:

public boolean getFrontier(int value)
{
 int n = 1;
    while(n <= 9)
    {
        if(value == n)
            return true;

        else n++;
    }
    return false;
}

现在,我正在尝试使用列表,但它并没有真正起作用......

  public boolean getFrontier(int value)
{
    ArrayList<Integer> reserve = new ArrayList<>();
    ListIterator iter = reserve.listIterator();

    for(int i = 1; i < 10; i++)    
    {
        reserve.add(i);
    }

    while(iter.hasNext())
    {
        int n = (int) iter.next();

        if(value == n)
            iter.remove();
        else if(!iter.hasNext() && value != n)
            return false;


    }
    return true;
}

如果有人可以解释我应该如何修复代码或提供更好的方法来检查重复项,我将非常感激!

最佳答案

简单的方法 [O(n^2)]

对于每个索引,检查另一个索引是否具有相同的值

for (int i=0; i<list.size(); i++)
    for (int j=i+1; j<list.size(); j++)
        if (list.get(i) == list.get(j))
            // found duplicate

更好的方法 [O(n)]

对于每个索引,保存看到的数字。如果一个数字出现多次,则说明您有一个重复的数字。

boolean[] seen = {false, false, false, false, false, false, false, false, false, false}
for (int i : list) {
    if (seen[i])
        // found duplicate
    else {
        seen[i] = true;
    }
}

委托(delegate)方式(让一些数据集来做)

Set 是一个没有重复项的集合。

HashSet(list).size() == list.size()

“时髦”方式(流)

因为 steam API 非常棒(仅限 Java 8):

list.stream().distinct().count() == list.size()

关于java - 数独 - 如何检查行、列、子方 block 中的重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41295912/

相关文章:

Java-异常处理

java - 并行运行多个 "java -version"时 CPU 使用率过高

java - 解码 jackson 树模型

java - 如何在JNA中制作结构?

java - 使用正则表达式在 ppm 文件中导入尺寸

java - 寻找船上最近的动物的算法

java - 三角形每次移动1

java - 有没有办法让 Swing GUI 自动全屏显示?

java - 外部文件 Java

java - 限制可以扩展类的内容 - Java