即使输入正确的数字,此方法也总是返回false。如果数字1-n ^ 2并且没有重复输入,那么它应该返回true。
public boolean checkValues()
{
int numCounter=1;
boolean okay=false;
while (numCounter<=n*n)
{
for (int i=0; i< n ; i++)
{
for (int j=0; j< n ; j++)
{
if ((int) square.get(i).get(j)==numCounter)
okay=true;
}
}
okay=false;
numCounter++;
}
if (numCounter==n*n)
return true;
else
return false;
}
最佳答案
将if (numCounter==n*n)
更改为if (numCounter==n*n+1)
,因为您的while循环最终将再次执行numCounter++;
,或者如果确实不需要检查while (numCounter<=n*n)
,则将while(numCounter<n*n)
替换为n*n
。
更新:
我注意到您最终并没有真正使用okay
,我认为您可能需要更改为:
public boolean checkValues()
{
int numCounter=1;
boolean okay=false;
while (numCounter<=n*n)
{
ok = false;
for (int i=0; i< n ; i++)
{
for (int j=0; j< n ; j++)
{
if ((int) square.get(i).get(j)==numCounter)
ok=true;
}
}
if(!ok) // numCounter cannot be found
return false;
numCounter++;
}
return true; // successfully passed the check through 1 to n^2
}
但是,我认为在时间复杂度方面更好的解决方案如下,您可以使用
HashSet
为您检查重复项。public boolean checkValues()
{
Set<Integer> total = new HashSet<Integer>();
for (int i=0; i< n ; i++){
for (int j=0; j< n ; j++){
int num = square.get(i).get(j);
if(num>=1 && num<=n*n)
total.add(num);
}
}
if(total.size() == n*n)
return true;
else
return false;
}