LeetCode 242.有效的字母异位词
题目链接:力扣
思路:题目意思其实用另一种说法就是在相同字母可任意组合情况下,题目中给出的是否是组合的一种。可以直接用哈希表记录所有字母的数量,只要两个字符串中每一个字母出现的次数都一样,则是有效的字母异位词。
代码:
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
int[] array = new int[26];
for (int i = 0; i < s.length(); i++) {
array[s.charAt(i) - 'a'] += 1;
}
for (int i = 0; i < t.length(); i++) {
array[t.charAt(i) - 'a'] -= 1;
}
for (int i = 0; i < array.length; i++) {
if (array[i] != 0) {
return false;
}
}
return true;
}
}
LeetCode 349. 两个数组的交集
题目链接:力扣
思路:需要快速判断一个元素是否出现在集合中,则使用哈希表。
代码:
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Map<Integer, Integer> status = new HashMap<>();
for (int i = 0; i < nums1.length; i++) {
status.put(nums1[i], status.getOrDefault(nums1[i], 0) + 1);
}
List<Integer> list = new ArrayList<>();
for (int i = 0; i < nums2.length; i++) {
if (status.containsKey(nums2[i]) && !list.contains(nums2[i])) {
list.add(nums2[i]);
}
}
int[] res = new int[list.size()];
int index = 0;
for (Integer integer : list) {
res[index++] = integer;
}
return res;
}
}
LeetCode 202.快乐数
题目链接:力扣
思路:想要通过这道题,最核心的是判断无限循环的条件,使用哈希表保存在处理过程中已经出现过的整数,当下一次还出现这个整数时就表明已经进入无限循环了,需要直接终止返回。
代码:
class Solution {
public boolean isHappy(int n) {
if (n == 1) {
return true;
}
Map<Integer, Integer> map = new HashMap<>();
while (n != 1) {
if (map.getOrDefault(n, 0) != 0) {
return false;
} else {
map.put(n, 1);
int tmp = 0;
while (n != 0) {
tmp += Math.pow(n % 10, 2);
n = n / 10;
}
if (tmp == 1) {
return true;
}
n = tmp;
}
}
return false;
}
}
LeetCode 1. 两数之和
题目链接:力扣
思路:维护一个以元素值为Key,元素所在索引为Value的哈希表,在遍历数组的过程中,只需要访问哈希表查询是否存在target - Key的记录是否存在即可,当存在则返回当前元素索引和target - Key对应Value的值即可。需要注意的是,可能存在同一个Key,但是有两个不同的Value,也就是索引值,所以Value使用的是List数据结构进行存放。
代码:
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, List<Integer>> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
List<Integer> list = map.getOrDefault(nums[i], new ArrayList<>());
list.add(i);
map.put(nums[i], list);
}
for (int j = 0; j < nums.length; j++) {
if (map.containsKey(target - nums[j]) && nums[j] == target - nums[j]) {
if (map.get(nums[j]).size() == 2) {
List<Integer> list = map.get(nums[j]);
return new int[]{list.get(0), list.get(1)};
}
}
if (map.containsKey(target - nums[j]) && nums[j] != target - nums[j]) {
return new int[]{map.get(nums[j]).get(0), map.get(target - nums[j]).get(0)};
}
}
return new int[]{};
}
}