可以解释一下为什么我们在 if 条件之后使用 put 吗? 实际上,我现在存储了先前的值,但没有分配它,输出是 (0,0)。
public class 2Sum {
public static void main(String[] args) {
int[] arr = { 11, 3, 7, 19, 14, 2 };
int target = 17;
int[] num = new int[2];
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < arr.length; i++) {
int sno = target - arr[i];
if (map.containsKey(sno)) {
num[0] = map.get(sno);
num[1] = i;
}
map.put(arr[i], i); //Why do we put after exiting the if condition
}
System.out.println(num[0] + " " + num[1]);
}
}
需要明确解释为什么我们在 if 条件之后使用 put。
//为什么退出if条件后要放
实际上,没有什么特别的理由把它放在那里。正如所写,您可以将其放在条件之前:
for (int i = 0; i < arr.length; i++) {
int sno = target - arr[i];
map.put(arr[i], i); // Before.
if (map.containsKey(sno)) {
num[0] = map.get(sno);
num[1] = i;
}
map.put(arr[i], i);
}
或者甚至在一个单独的、先前的循环中:
for (int i = 0; i < arr.length; i++) {
map.put(arr[i], i);
}
for (int i = 0; i < arr.length; i++) {
int sno = target - arr[i];
if (map.containsKey(sno)) {
num[0] = map.get(sno);
num[1] = i;
}
map.put(arr[i], i);
}
该语句的要点是用可以找到特定值的索引来填充
map
。
将其放在条件语句之后的唯一原因是条件语句包含
break
:
for (int i = 0; i < arr.length; i++) {
int sno = target - arr[i];
if (map.containsKey(sno)) {
num[0] = map.get(sno);
num[1] = i;
break; // HERE
}
map.put(arr[i], i);
}
这里的区别在于,当找到解决方案时立即停止,而不是继续处理数组中的后续条目。如果您有一个非常大的
arr
,这可能会使代码更快,因为一旦找到解决方案,就没有必要将内容放入 map
,因为您不会在解决方案中使用它们。