java数字对算法

时间:2017-07-31 14:35:45

标签: java algorithm

我最近一直在关注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);  
   }
}

1 个答案:

答案 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