最有效的方法来计算产品是完美正方形的数组中的对数?

时间:2016-02-26 15:37:17

标签: java

我的解决方案是:

采取所有可能的对(不是与要求的问题具有相同元素的对),然后检查第一个元素是否为完美正方形 检查其他元素是否完美。

检查完美正方形只是得到平方根并检查小数部分。

我在接受采访时被问到这个问题,但要求做得更好。 任何人都可以给我一个更好的方法。

int cnt = 0.0;
for (int i = 0; i < test; i++)  {
    for (int j = 0; j < test; j++)  {
        if (!(i == j))  {
            double prod = Math.sqrt(arr[i]);
            int prodi = (int) prod;
            double frac = prod - prodi;
            if (frac == 0.0) {
                //System.out.println("SAdfs");
                prod=Math.sqrt(arr[j]);
                prodi = (int)prod;
                frac = prod-prodi;
                if (frac == 0.0) {
                    cnt++;
                }
            }
        }       
    }
}

double denom=test*(test-1);
double result=cnt/denom;
String strDouble = String.format("%.6f", result);
System.out.println(result);

3 个答案:

答案 0 :(得分:3)

您需要找到两个输入的阶乘以及它们的计数,例如

12 = 2 ^ 2, 3 ^ 1;
27 = 3 ^ 3;

然后你需要总结两个输入的阶乘因子(例如我给出的,将是2:2,3:4)。如果所有因子都有一个可被2整除的因子(即因子%2 == 0)那么它就是一个完美的正方形

答案 1 :(得分:1)

我对您的解决方案做了一些澄清。但是,如果我正确理解你的问题,你需要这个

输入数组:{1,2,3,4,5,20,25} 输出:4对不同 它们是:{1,4},{1,25},{4,25},{5,20}

下面的解决方案使用您识别完美正方形的逻辑(sqrt和double - int值== 0.0)。但实现了计算对的逻辑。

public class PerfectSq {



    public static List<NumbPairs> count(int[] input)
    {


        List<NumbPairs> pairs = new ArrayList<NumbPairs>();

        for(int i = 0;i<input.length;i++)
        {
            for(int j = (i+1);j<input.length;j++)
            {
                if(i!=j)
                {
                    if(isPerfectSquare(input[i]*input[j]))
                    {

                        pairs.add(new NumbPairs(input[i],input[j]));

                    }
                }
            }
        }

        return pairs;
    }


    private static boolean isPerfectSquare(int i)
    {


            double sqr = Math.sqrt(i);
            int sq = (int) sqr;
            return ((sqr-sq)==0.0);

    }

    public static void main(String[] args)
    {
        int[] input = new int[5];
        input = new int[]{1,2,3,4,5,25,20};

        List<NumbPairs> numbPairs = count(input);

        System.out.println(numbPairs );

        System.out.println(numbPairs.size());


    }
}

class NumbPairs
{
    int i;
    int j;

    public NumbPairs(int i, int j)
    {
        this.i = i;
        this.j = j;

    }

    public String toString()
    {
        return i+","+j+" ";

    }
}

你可以通过添加它来改善它,所以如果它已经被计算,它不必检查数字是否完美正方形。这在更大的数组大小中很有用。

public static Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();

private static boolean isPerfectSquare(int i)
    {

        Boolean square = map.get(i);

        if(square!=null)
        {
            return square;
        }
        else
        {
            double sqr = Math.sqrt(i);
            int sq = (int) sqr;
            return ((sqr-sq)==0.0);
        }
    }

答案 2 :(得分:0)

如果第一个元素必须是正方形,则应在进入第二个循环(j)之前检查它。如果你不需要检查第二个数字,如果第一个数字不是完美的方形,你为什么要这样做?

如果数组很长并且数字很大,这将显着延长给定代码的执行。

int cnt=0.0;
for(int i=0;i<test;i++)
{
double prod=Math.sqrt(arr[i]);
      int prodi=(int)prod;
      double frac=prod-prodi;
      if(frac==0.0){
        for(int j=0;j<test;j++)
        {
           if(!(i==j))
            {

                    //System.out.println("SAdfs");
                     prod=Math.sqrt(arr[j]);
                    prodi=(int)prod;
                     frac=prod-prodi;
                   if(frac==0.0){
                    cnt++;
                   }
            }
        }       
    }
}
double denom=test*(test-1);
double result=cnt/denom;
String strDouble = String.format("%.6f", result);
System.out.println(result);