java哈希 给定一个长度为偶数的整数数组 arr,只有对 arr 进行重组后可以满足 “对于每个 0 <= i < len(arr) / 2,都有 arr[2 * i + 1] = 2 * arr[2 * i]” 时,返回 true;否则,返回 false。 ja
时间: 2024-04-30 12:17:37 浏览: 94
va中可以使用哈希表(HashMap)来解决这个问题。具体思路如下:
1. 首先将数组中的所有元素存入哈希表中,以元素值为 key,元素出现次数为 value。
2. 然后遍历数组中的每个元素,对于每个元素 arr[i],判断其是否满足 arr[i] * 2 出现的次数是否和 arr[i] 出现的次数相等。
3. 如果所有元素都满足条件,则返回 true,否则返回 false。
下面是代码实现:
```java
public boolean canReorderDoubled(int[] arr) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : arr) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
Arrays.sort(arr);
for (int num : arr) {
if (map.get(num) == 0) {
continue;
}
int target = num < 0 ? num / 2 : num * 2;
if (num < 0 && num % 2 != 0 || map.getOrDefault(num, 0) > map.getOrDefault(target, 0)) {
return false;
}
map.put(num, map.get(num) - 1);
map.put(target, map.get(target) - 1);
}
return true;
}
```
这段代码中,首先遍历数组,将每个元素的出现次数存入哈希表中。然后对数组进行排序,依次遍历数组中的每个元素。对于每个元素,首先判断其出现次数是否为0,如果为0,则跳过。
然后根据元素值的正负性判断其对应的目标值,即 target = num * 2 或 target = num / 2。如果 num 为负数且 num 不是偶数,则不存在与之匹配的目标值,因此返回 false。如果 num 出现的次数大于 target 出现的次数,则也无法匹配,返回 false。
如果 num 和 target 都可以匹配,则将它们的出现次数都减1,表示已经匹配成功。最后如果所有元素都能够匹配成功,则返回 true。
阅读全文