从地图中获取两个元素,它们的总和等于所需的数字
Getting two elements from a map which their sum equals to a desired number
我正在尝试找到一种方法来从地图中获取前 2 个元素,它们的值相加得到了我想要的总和。
我在想一个解决方案,它结合了 2 张地图,其中第二张地图的键是目标号码的提醒减去第一张地图的条目值。
我迷路了,不确定我错过了什么。
我在这里错过了什么?
您面临的问题是 int 是值,而不是键。
所以 pairOfItems.containsKey(remainder)
不应该编译。
幸运的是,Map 也有 containsValue()
方法。只要对最低性能没有要求,就可以解决你的问题。
...而且您不需要第二张地图。你可以直接问 items.containsValue(reminder)
我建议引入一个新地图 remainderToItem
,遍历所有相关项目并将它们的提醒添加到地图中作为键,将项目键作为值
然后再次迭代 relevantItems
地图以发现价格与其他提醒匹配
还要检查 remainderToItem.get(entry.getValue()).equals(entry.getKey()))
(如果值是 50 提醒也是 50),这可以防止再次将相同的项目添加到 itemsThatCanBeBought
private static List<String> getTwoItemsWhichSumTo100(Map<String, Integer> items, int target) {
Map<String, Integer> relevantItems = getRelevantItems(items, target);
Map<Integer, String> remainderToItem = new HashMap<>();
List<String> itemsThatCanBeBought = new ArrayList<>();
for (Map.Entry<String, Integer> entry : relevantItems.entrySet()) {
int remainder = target - entry.getValue();
remainderToItem.put(remainder, entry.getKey());
}
for (Map.Entry<String, Integer> entry : relevantItems.entrySet()) {
if (remainderToItem.containsKey(entry.getValue()) && !remainderToItem.get(entry.getValue()).equals(entry.getKey())) {
itemsThatCanBeBought.add(entry.getKey());
itemsThatCanBeBought.add(remainderToItem.get(entry.getValue()));
return itemsThatCanBeBought;
}
}
return itemsThatCanBeBought;
}
private static Map<String, Integer> getRelevantItems(Map<String, Integer> items, int target) {
Map<String, Integer> relevantItems = new HashMap<>();
for (Map.Entry<String, Integer> entry : items.entrySet()) {
if (entry.getValue() < target) relevantItems.put(entry.getKey(), entry.getValue());
}
return relevantItems;
}
我正在尝试找到一种方法来从地图中获取前 2 个元素,它们的值相加得到了我想要的总和。 我在想一个解决方案,它结合了 2 张地图,其中第二张地图的键是目标号码的提醒减去第一张地图的条目值。 我迷路了,不确定我错过了什么。 我在这里错过了什么?
您面临的问题是 int 是值,而不是键。
所以 pairOfItems.containsKey(remainder)
不应该编译。
幸运的是,Map 也有 containsValue()
方法。只要对最低性能没有要求,就可以解决你的问题。
...而且您不需要第二张地图。你可以直接问 items.containsValue(reminder)
我建议引入一个新地图 remainderToItem
,遍历所有相关项目并将它们的提醒添加到地图中作为键,将项目键作为值
然后再次迭代 relevantItems
地图以发现价格与其他提醒匹配
还要检查 remainderToItem.get(entry.getValue()).equals(entry.getKey()))
(如果值是 50 提醒也是 50),这可以防止再次将相同的项目添加到 itemsThatCanBeBought
private static List<String> getTwoItemsWhichSumTo100(Map<String, Integer> items, int target) {
Map<String, Integer> relevantItems = getRelevantItems(items, target);
Map<Integer, String> remainderToItem = new HashMap<>();
List<String> itemsThatCanBeBought = new ArrayList<>();
for (Map.Entry<String, Integer> entry : relevantItems.entrySet()) {
int remainder = target - entry.getValue();
remainderToItem.put(remainder, entry.getKey());
}
for (Map.Entry<String, Integer> entry : relevantItems.entrySet()) {
if (remainderToItem.containsKey(entry.getValue()) && !remainderToItem.get(entry.getValue()).equals(entry.getKey())) {
itemsThatCanBeBought.add(entry.getKey());
itemsThatCanBeBought.add(remainderToItem.get(entry.getValue()));
return itemsThatCanBeBought;
}
}
return itemsThatCanBeBought;
}
private static Map<String, Integer> getRelevantItems(Map<String, Integer> items, int target) {
Map<String, Integer> relevantItems = new HashMap<>();
for (Map.Entry<String, Integer> entry : items.entrySet()) {
if (entry.getValue() < target) relevantItems.put(entry.getKey(), entry.getValue());
}
return relevantItems;
}