LeetCode1.两数之和
大家可能看到这是LeetCode1,可能觉得很简单,但是如果你没有了解过哈希这种结构,第一个题其实并不简单。
首先哈希表一般有三种实现方式,分别是 Java中的
- 数组 array
- Set
- Map
那么本题我们就使用到 Map 的实现哈希表的方式去实现。
代码如下:
public int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
if (nums == null || nums.length == 0) {
return result;
}
Map<Integer, Integer> map = new HashMap<>();
//遍历nums
for (int i = 0; i < nums.length; i++) {
//确定目标值
int temp = target - nums[i];
//寻找map中是否有符合条件的key
if (map.containsKey(temp)) {
result[1] = i;
result[0] = map.get(temp);
break;
}
//如果没有找到,就将当前的数组下标和数组下标对应的值加入到map中
map.put(nums[i], i);
}
return result;
}
LeetCode202.快乐数
本题的关键还是利用哈希表的特性,快速找出一个元素是否出现在集合中。
代码如下:
public boolean isHappy(int n) {
Set<Integer> record = new HashSet<>();
//终止循环的条件
//如果n = 1表示是快乐数,
//如果n = 他自己本身,说明会进入无限循环状态,说明不是快乐数
while (n != 1 && !record.contains(n)) {
record.add(n);
n = getNextNumber(n);
}
return n == 1;
}
private int getNextNumber(int n) {
int res = 0;
while (n > 0) {
//个位的数
int temp = n % 10;
res += temp * temp;
n /= 10;
}
return res;
}
LeetCode242.有效的字母异位词
本题利用数组实现哈希表。
代码如下:
public boolean isAnagram(String s, String t) {
//因为字符串都是小写字母,所以数组大小选择 26
int[] record = new int[26];
//遍历字符串s
for (int i = 0; i < s.length(); i++) {
record[s.charAt(i) - 'a']++;
}
//遍历字符串t
for (int i = 0; i < t.length(); i++) {
record[t.charAt(i) - 'a']--;
}
for (int i = 0; i < record.length; i++) {
record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
if (record[i] != 0) {
return false;
}
}
// record数组所有元素都为零0,说明字符串s和t是字母异位词
return true;
}
LeetCode349.两个数组的交集
本题则利用了 set 实现哈希表。
代码如下:
public int[] intersection(int[] nums1, int[] nums2) {
if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
return new int[0];
}
//定义两个哈希表
Set<Integer> nums1Set = new HashSet<>();
Set<Integer> resultSet = new HashSet<>();
for (int i : nums1) {
nums1Set.add(i);
}
for (int i : nums2) {
if (nums1Set.contains(i)) {
resultSet.add(i);
}
}
return resultSet.stream().mapToInt(x -> x).toArray();
}