我最近一直在关注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]!= nums [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);
}
}
答案 0 :(得分:0)
简单的想法:对于输入的每个数字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);
Runnable版本:http://ideone.com/lqmuyL
此实施的平均时间复杂度为O(n)
,且为online algorithm。