我的解决方案是:
采取所有可能的对(不是与要求的问题具有相同元素的对),然后检查第一个元素是否为完美正方形 检查其他元素是否完美。
检查完美正方形只是得到平方根并检查小数部分。
我在接受采访时被问到这个问题,但要求做得更好。 任何人都可以给我一个更好的方法。
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);
答案 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);