242.有效的字母异位词
Leetcode链接: link
方法一:HashMap
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
Map<Character, Integer> table = new HashMap<Character, Integer>();
for(int i = 0; i < s.length(); i ++){
char c = s.charAt(i);
if(table.containsKey(c)){
table.put(c,table.get(c)+1);
}else{
table.put(c,1);
}
}
System.out.println(table.toString());
for(int i = 0; i < t.length(); i ++){
char c = t.charAt(i);
if(table.containsKey(c)){
int temp = table.get(c);
if(temp == 0){
return false;
}else{
table.put(c,temp-1);
}
}else{
return false;
}
}
System.out.println(table.toString());
return true;
}
}
这是我想出来的第一种方法,用计算频率的方法计算String中每个Char出现的频率。因为我自己平时使用map的比较多,所以第一时间想到的就是这个方法。有个要注意的地方是我本来是这么写的:把String1加入到map里面,然后再把String2从map里删除,然后最后再使用isEmpty查看map是不是空的。后面改成了在前面查看String1和String2的长度是不是一样的。这样就可以省略isEmpty这一步了。
下面这个方法,是我看了答案思路写出的来的,答案基本上都是用的这个方法,使用array代替map,这个方法快了很多。
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
int[] table = new int[26];
for(int i = 0; i < s.length(); i ++){
char c = s.charAt(i);
table[c - 'a'] ++;
}
for(int i = 0; i < t.length(); i ++){
char c = t.charAt(i);
if(table[c - 'a'] == 0){
return false;
}else{
table[c - 'a'] --;
}
}
return true;
}
}
349. 两个数组的交集
Leetcode链接: link
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<>(); //set for nums1
Set<Integer> set2 = new HashSet<>(); //set for Intersection
for (int i : nums1) {
set1.add(i);
}
for (int i : nums2) {
if(set1.contains(i)){
set2.add(i);
}
}
int arr[] = new int[set2.size()];
int i = 0;
for (int x : set2){
arr[i++] = x;
}
return arr;
}
}
这题用set不能有重复值的特性来做,把nums1放入set中,在把num1和num2重复的值放入set2,这个set2就是两个数组的交集。我们只需要把这个set变成array返回就可以了。
202. 快乐数
Leetcode链接: link
class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<Integer>();
int num = n;
while(!set.contains(num)){
set.add(num);
int sum = 0;
while(num != 0){
int temp = num % 10;
sum += (temp *temp);
num /= 10;
}
if(sum == 1){
return true;
}
num = sum;
}
return false;
}
}
这题看似是一道无线循环的题目,但是我们可以找到让他停下来的方法。
比如这个示例 1中:
我们只需要寻找如果82,68,100这些数字如果重复出现了的话。就说明进入循环了,这时候我们就可以结束了。所以我们需要用一个set来存放所有的sum。
1. 两数之和
Leetcode链接: link
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int[] result = new int[2];
for (int i = 0; i < nums.length; ++i) {
if(map.containsKey(target - nums[i])){
result[0] = map.get(target - nums[i]);
result[1] = i;
return result;
}else{
map.put(nums[i],i);
}
}
return result;
}
}
这一题我之前肯定做过,但是让我这一次做我觉得我一开始会想不起来要用hashmap来做,想到用hashmap来做的人简直是天才。我一开始看到了建议我使用hashmap,我还在想如何使用hashmap,一开始是觉得把array全部塞入hashmap里面,然后再遍历一遍array找?但是直觉告诉我这不对,我也在思考如果都加入hashmap,那比如[3,3]这样如何加入hashmap?
后来也是去研究了一下答案,没想到是答案是这样的:遍历数组,检查当前位置的element在map里面有没有加起来等于target的,如果没有则把当前的element加入到map里。
总结
今天也是复习了一遍hashtable,个人还是很喜欢用hashtable的,hashtable的唯一性和O(1)的查找速度能让他在很多场景适用,而且理解起来也很简单,即使你不知道hashtable的内部原理是什么,但是你只要知道Hashmap的API也可以使用。偏简单