Day 6: Hash Table
(Day 5 is a break day)
哈希表的目的:为了快速判断元素是否出现在集合里。
class Solution {
public boolean isAnagram(String s, String t) {
int len = s.length();
if(len != t.length()) return false;
int[] arr = new int[26];
for(int i = 0; i < len; ++i){
++arr[s.charAt(i) - 'a'];
}
for(int i = 0; i < len; ++i){
--arr[t.charAt(i) - 'a'];
}
for(int i = 0; i < 26; ++i){
if(arr[i] != 0) return false;
}
return true;
}
}
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set = new HashSet<>();
Set<Integer> set2 = new HashSet<>();
int len1 = nums1.length;
int len2 = nums2.length;
for(int i = 0; i < len1; ++i){
set.add(nums1[i]);
}
for(int i = 0; i < len2; ++i){
if(set.contains(nums2[i])) set2.add(nums2[i]);
}
int[] arr = new int[set2.size()];
Iterator<Integer> iter = set2.iterator();
for(int i = 0; i < arr.length; ++i){
arr[i] = iter.next();
}
return arr;
}
}
如果是C++,可以用unordered_set来做。
class Solution {
private int getSum(int n){
int sum = 0;
while(n > 0){
int digit = n % 10;
n /= 10;
sum += digit * digit;
}
return sum;
}
//计算sum的private方法
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
int tmp = n;
while(true){
int res = getSum(n);
if(res == 1) return true;
if(!set.add(res)) return false;
n = res;
}
//这里没有return也可以!!
}
}
挺神奇的。正常解法很简单,但用set也可做。一旦有重复就说明出现了循环,那么可以直接return false. 如果出现1,直接return true即可。
我是抄的答案思路,希望再看到这题可以自己写出来。
4.Two Sum
class Solution {
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < len; ++i){
if(map.containsKey(nums[i])){
return new int[]{map.get(nums[i]),i};
}
map.put(target-nums[i], i);
}
return new int[]{1}; //optional, 瞎写的
}
}
思路是map:要找的值-找到的index. 简单的基础题。
文章介绍了哈希表在解决编程问题中的应用,如判断两个字符串是否为变位词、求两个数组的交集、判断快乐数以及两数之和问题,利用哈希数据结构实现快速查找和避免循环。

被折叠的 条评论
为什么被折叠?



