因此,我正在尝试创建一个包含整数 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/