Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java数对算法_Java_Algorithm - Fatal编程技术网

java数对算法

java数对算法,java,algorithm,Java,Algorithm,最近,我一直在看一段YouTube视频中的一个问题,这段视频是关于一位软件开发人员在谷歌面试一个职位的。在视频中,给候选人一个随机数数组,并询问他们将如何开发一个程序来计算数组中的总数对,该数组的总数为8。例如,给定数组{1,3,4,5,7},答案是2,1,7和3,5。在继续观看候选人如何解决这个问题之前,我决定自己试一试。正如您将从我用Java编写的对这个问题相当粗糙的方法中看到的,我决定使用嵌套的for循环来迭代每个数字组合,并使用if语句进行相应的计算。我相信您也会同意,该准则在许多方面都

最近,我一直在看一段YouTube视频中的一个问题,这段视频是关于一位软件开发人员在谷歌面试一个职位的。在视频中,给候选人一个随机数数组,并询问他们将如何开发一个程序来计算数组中的总数对,该数组的总数为8。例如,给定数组{1,3,4,5,7},答案是2,1,7和3,5。在继续观看候选人如何解决这个问题之前,我决定自己试一试。正如您将从我用Java编写的对这个问题相当粗糙的方法中看到的,我决定使用嵌套的for循环来迭代每个数字组合,并使用if语句进行相应的计算。我相信您也会同意,该准则在许多方面都有规定:

a为了避免递归对(如1,7和7,1),我将外部for循环中的迭代次数限制为nums.length/2。这实际上适用于有限的数字集,但当显示数字集(如0,0,0,0,0,1,3,4,5,7)时,当然会失败

b为了避免在嵌套for循环中将数字4计为一对,我添加了条件代码nums[I]!=努姆斯[j]。同样,当使用诸如{1,3,4,4,5,7}之类的数字集时,这种方法失败,这些数字集包含需要添加到计数中的合法对4,4

作为一个编程新手,嗯……我能说什么?……我尽了最大努力。但我非常渴望从经验丰富的程序员那里学习,并且非常有兴趣听到关于如何解决此类问题的其他想法。对此有何想法……非常感谢

package numberpairs;

import java.util.Arrays;

public class DisApp {

public static void main(String[] args) {

    int[] nums = {4,2,6,1,5,7,3};

    Arrays.sort(nums);
    System.out.println(Arrays.toString(nums));

    int count =0;
    for(int i=0; i<nums.length/2; i++){
        for(int j=0; j<nums.length; j++){       
            if(nums[i]+nums[j]==8 && nums[i] != nums[j]){
                count++;                            
            }       
         }              
     }
    System.out.println(count);  
   }
}

简单的想法是:对于输入中的每一个数字i,我们应该找到之前输入中等于8-i的数字的数量。这可以通过HashMap实现:

int S = 8;
int[] input = {1,3,4,5,7,7,4};
Map<Integer, Integer> m = new HashMap<>();

int answer = 0;
for (int i : input) {
    int j = S - i;
    if (m.containsKey(j)) {
        answer += m.get(j);
    }

    if (m.containsKey(i)) {
        m.put(i, m.get(i) + 1); 
    } else {
        m.put(i, 1);
    }
}
System.out.println(answer);
可运行版本:


此实现具有平均案例时间复杂性,并且是。

代码审查问题应发布在代码审查Stackexchange上。不在这里。你似乎没有错。代码复查堆栈交换将是此站点的合适站点如果您允许,您应该能够自己修复错误,因为您自己已经识别了错误。在代码复查部分,我同意其他人的看法。不过,作为一个自己解决问题的小提示:您已经识别了nums[i]!=nums[j]是一个问题,取决于是否多次包含同一个数字。你知道数组中的位置,这应该足以让你区分你例子中的4个。外循环从开始到最后一个,内循环从外循环的实际值开始到结束…谢谢DAle,我会研究一下。