我指的是之前提到的以下question。而且,我对以下提到的解决方案感兴趣:
我试图理解下面的整数数组,我在迭代#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] = 08
和pairs.get(input[i]))
,这也是上面第6次迭代中的08?
其次,就codaddict算法而言,我在网上找不到任何东西。
答案 0 :(得分:1)
当<!X
,>
,但i==4
为input[i] == 8
时,等于4,因为在上一次迭代中,当我为3时,我们执行了{{ 1}},或按顺序pairs.get(input[i]))
。
答案 1 :(得分:1)
我认为你首先需要理解算法。我们想在数组中找到sum为K的数字对。
如果数组中有两个数字(x,y),其中sum为K,那么
x+y = k,
or y = k-x.
现在,对于数字 x ,我们将 x 映射到键(k-x)。
然后对于另一个数字 y ,如果我们发现 y 在地图中,那意味着有一个数字 x 映射(kx),它等于 y 。现在,从地图中我们可以找到原始的 x 并打印出来。
答案 2 :(得分:1)
简要介绍了你引用的答案。要回答你的问题,
为什么我们打印输入[i] = 08和pairs.get(input [i]))在上面的迭代#5中也是08?
正在打印input[i]
8
,pairs.get(input[i])
表示pairs.get(8)
4
。
你需要知道的是,那段Java代码并没有实现Codaddict的逻辑。它看起来有点像,但它只是做了不同的事情:Codaddict将输入值存储为键,索引作为值,而Java实现将(sum-value)
作为键存储,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也是如此)。但是,具有处理数字重复的逻辑实际上很容易。