即使输入正确的数字,此方法也总是返回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;
}

10-07 23:15