检查值方法不适用于检查幻方

时间:2015-02-01 15:48:23

标签: java

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

1 个答案:

答案 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;
}