java数对算法
最近,我一直在看一段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 作为一个编程新手,嗯……我能说什么?……我尽了最大努力。但我非常渴望从经验丰富的程序员那里学习,并且非常有兴趣听到关于如何解决此类问题的其他想法。对此有何想法……非常感谢java数对算法,java,algorithm,Java,Algorithm,最近,我一直在看一段YouTube视频中的一个问题,这段视频是关于一位软件开发人员在谷歌面试一个职位的。在视频中,给候选人一个随机数数组,并询问他们将如何开发一个程序来计算数组中的总数对,该数组的总数为8。例如,给定数组{1,3,4,5,7},答案是2,1,7和3,5。在继续观看候选人如何解决这个问题之前,我决定自己试一试。正如您将从我用Java编写的对这个问题相当粗糙的方法中看到的,我决定使用嵌套的for循环来迭代每个数字组合,并使用if语句进行相应的计算。我相信您也会同意,该准则在许多方面都
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,我会研究一下。