即使输入正确的数字,此方法也始终返回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;
}
答案 0 :(得分:1)
将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;
}