java - 了解 Pair of Sum 和 codaddict 的算法

标签 java arrays algorithm

我指的是以下question这是之前问过的。而且,我对那里提到的以下解决方案感兴趣:

enter image description here

我试图理解以下整数数组,但在迭代 #5 后我迷失了,如下所示:

假设我们的整数数组是:{1,2,3,4,8,9,10},我们应该打印总和等于 12 的那些对。所以,我尝试了逐步分析如果我们应用上述方法会发生什么:

                             Key             Value   
Iteration 1 : i = 0       (12-1) = 11          1 
Iteration 2 : i = 1       (12-2) = 10          2
Iteration 3 : i = 2       (12-3) = 09          3
Iteration 4 : i = 3       (12-4) = 08          4
Iteration 5 : i = 4       // pairs.containsKey is true here so printing 
                             input[i] = 8   

谁能解释一下为什么我们要打印 input[i] = 08pairs.get(input[i])) (迭代中也是 08 #) 5以上?

其次,就 codaddict 的算法而言,我在网上没有找到任何内容。

最佳答案

简单浏览了一下您引用的答案。回答你的问题,

why are we printing input[i] = 08 and pairs.get(input[i])) which is also 08 in iteration #5 above?

它正在打印input[i],即8,以及pairs.get(input[i]),这意味着 pairs.get(8)4


您需要知道的是,那段 Java 代码没有实现 Codaddict 的逻辑。它看起来有点像,但它只是做了一些不同的事情:Codaddict 将输入值存储为键,将索引存储为值,而 Java 实现将 (sum-value) 存储为键和 作为值。

Java 实现并不理智。它所做的事情可以简化为:

public static void printSumPairs(int []input, int sum){
    Set<Integer> previousInts = new HashSet<>();

    for (int i : input) {
        if (previousInts.contains(sum - i)) {
             System.out.print("" + (sum - i) + ", " + i);
        } else {
             previousInts.add(i);
        }
    }
}

这基本上实现了与 Java impl 相同的结果,并且(我相信)更容易理解。

不过,对于重复的数字不能很好地工作(这与原始的 Java impl 相同)。然而,拥有一个处理数字重复的逻辑实际上很容易。

关于java - 了解 Pair of Sum 和 codaddict 的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33274952/

相关文章:

java - 在装配线线程之间传递作业

java - 如何使用 ObjectMapper 以 Json 格式读取包含 String 和 List<String> 的对象

java - 如何跳过包含字符串的 .last Modified() 文件,并选择下一个 .last Modified() 文件

java - Firebase:处理 setValue 失败

c - 无法将字符串写入 *char[]

Java - 在不知道字符编码的情况下将 byte[] 转换为 String

ios - 比较 1 个 NSarray 和 1 个 NSset 在其中的 1 个中重复计数

c++ - 计算前缀和

algorithm - 列表的最大后缀

c++ - 在 C++ 中寻找线性方程组的最优解