一句话总结:哈希表基础手速题。
原题链接:242 有效的字母异位词
先比较字符串长度,然后用哈希表比较每个字符出现的次数,小于0返回false即可。
class Solution {
public boolean isAnagram(String s, String t) {
Map<Character, Integer> map = new HashMap<>();
int m = s.length(), n = t.length();
if (s.length() != t.length()) return false;
for (int i = 0; i < m; i++) {
char ch = s.charAt(i);
map.put(ch, map.getOrDefault(ch, 0) + 1);
}
for (int i = 0; i < n; i++) {
char ch = t.charAt(i);
map.put(ch, map.getOrDefault(ch, 0) - 1);
if (map.get(ch) < 0) return false;
}
return true;
}
}
官解的另一种解法是将两字符串转换成字符数组,排序后返回两数组的equals()方法比较结果。
原题链接: 349 两个数组的交集
也没什么难度,开一个set两边比较一下就可以输出答案了。唯一有疑惑的地方是最后将List<Integer>转换成int[ ]输出,用stream()方法会更轻松些,而无需开数组将答案重新写一次。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set = new HashSet<>();
List<Integer> ans = new ArrayList<>();
for (int i = 0; i < nums1.length; i++) {
set.add(nums1[i]);
}
for (int i = 0; i < nums2.length; i++) {
if (set.contains(nums2[i]) && !ans.contains(nums2[i])) ans.add(nums2[i]);
}
int[] res = new int[ans.size()];
for (int i = 0; i < ans.size(); i++) {
res[i] = ans.get(i);
}
return res;
}
}
原题链接:202 快乐数
这道题是之前做过的。其实今天的四道题有三道之前都做过。因为提示是哈希表,所以很快就有了思路,不过还是debug了一会儿。还是不够熟练。
class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
while (n != 1 && !set.contains(n)) {
set.add(n);
int tmp = 0;
while (n > 0) {
int a = n % 10;
tmp += a * a;
n /= 10;
}
n = tmp;
}
return n == 1;
}
}
原题链接:1 两数之和
鼎鼎有名的力扣第一题。因为提示用时间复杂度小于的算法,不难想到用哈希表找唯一值。有错误的地方是要先判断containsKey()再put(),否则会出现返回[i, i]的问题(nums[i] == target / 2的时候)。
class Solution {
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < n; i++) {
int a = target - nums[i];
if (map.containsKey(a)) return new int[]{i, map.get(a)};
map.put(nums[i], i);
}
return new int[2];
}
}