public List<List<Integer>> findDifference(int[] nums1, int[] nums2) {
HashSet<Integer> set1 = new HashSet<>();
HashSet<Integer> set2 = new HashSet<>();
for(int x: nums1) set1.add(x);
for(int x: nums2) set2.add(x);
List<List<Integer>> ans = new ArrayList<>();
ArrayList<Integer> t1 = new ArrayList<>();
ArrayList<Integer> t2 = new ArrayList<>();
// 遍历对应的set,求不包含的内容
for(int x: set1) {
if(!set2.contains(x)) t1.add(x);
}
for(int x: set2) {
if(!set1.contains(x)) t2.add(x);
}
ans.add(t1); ans.add(t2);
return ans;
}
public boolean uniqueOccurrences(int[] arr) {
// 构造hashmap
HashMap<Integer, Integer> map = new HashMap<>();
for(int x: arr) {
map.put(x, map.getOrDefault(x, 0) + 1);
}
// 构造次数集合
Set<Integer> set = new HashSet<>();
for(int x: map.values()) {
set.add(x);
}
// 判断两者大小是否相等
return map.keySet().size() == set.size();
}
private HashMap<Character, Integer> getMap(String w) {
HashMap<Character, Integer> map = new HashMap<>();
for(char x: w.toCharArray()) {
map.put(x, map.getOrDefault(x, 0) + 1);
}
return map;
}
public boolean closeStrings(String word1, String word2) {
HashMap<Character, Integer> map1 = getMap(word1);
HashMap<Character, Integer> map2 = getMap(word2);
// 深拷贝拷贝字符种类
Collection<Integer> c2 = map2.values().stream().collect(Collectors.toList());
Set<Character> k2 = map2.keySet();
// 判断次数是不是一样
for(int x: map1.values() ) {
if(c2.contains(x)) c2.remove(x);
else return false;
}
// 判断字符种类是不是一样
for(Character x: map1.keySet() ) {
if(k2.contains(x)) k2.remove(x);
else return false;
}
return true;
}
除了两次for循环之外,我们还可以使用哈希表存储每个数字的位置。但是当我们拿到一个数字时,首先应该判断有没有剩余数字,如果有直接返回。最后在添加进入哈希表中。
这样做的原因是如果target = 6,nums = [1,3],则会出现2 * 3=6的情况。
class Solution {
HashMap<Integer, Integer> map = new HashMap<>();
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
for(int i = 0; i < n; i++) {
// 1. 先判断当前有没有剩余数字
int surplus = target - nums[i];
if(map.containsKey(surplus)) {
// 2. 如果满足,返回
return new int[] {map.get(surplus), i};
}
// 3. 存储基本位置
map.put(nums[i], i);
}
return new int[] {-1, -1};
}
}
核心思想:就是使用哈希表进行判断数字是否出现过