242.有效的字母异位词
题目:242. 有效的字母异位词 - 力扣(LeetCode)
视频讲解:Leetcode:242.有效的字母异位词_哔哩哔哩_bilibili
思路:用哈希表,字符串的字母作为key,出现的次数作为value,先遍历string s,得到hashmap,再遍历string t,每次遍历先判断hashmap有无该字符,没有直接返回false,有的话就把次数-1,遍历循环后,判断最后的hashmap是否为空,为空则返回true
尝试 ( 头一次按照自己的思路写对了❗)
class Solution {
public boolean isAnagram(String s, String t) {
Map<Character,Integer> charCountMap = new HashMap<>();
// 遍历字符串s
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (charCountMap.containsKey(c)) {
charCountMap.put(c, charCountMap.get(c) + 1);
} else {
charCountMap.put(c, 1);
}
}
for (int i = 0; i < t.length(); i++) {
char c = t.charAt(i);
if (charCountMap.containsKey(c)&&charCountMap.get(c)>0) {
charCountMap.put(c, charCountMap.get(c) - 1);
} else {
return false;
}
}
// 遍历HashMap中的所有条目
int sum = 0;
for (Map.Entry<Character, Integer> entry : charCountMap.entrySet()) {
// 累加每个条目的value
sum += entry.getValue();
}
if(sum==0){
return true;
}
return false;
}
}
收获
- Java基础知识
-
char c = s.charAt(i); 取出字符串s的第i个字符
-
charCountMap.containsKey(c),判断map里面是否包含c
-
charCountMap.get(c),获取c对应的value
-
charCountMap.put(key,value); 存入key和value到哈希表
-
for (Map.Entry<Character, Integer> entry : charCountMap.entrySet()),遍历哈希表的entry
-
entry.getValue(),获取entry的value
-
record[s.charAt(i) - 'a'],通过 - 'a' 的操作,可以将 a-z 的小写字母映射到数字 0-25
-
-
哈希的数据结构,可以用数组,set和map来实现
-
数据量小,考虑用数组,比如本题
-
数据量大,考虑用set
-
要存储键值对,考虑用map
-
349. 两个数组的交集
题目:349. 两个数组的交集 - 力扣(LeetCode)
视频讲解:Leetcode:349. 两个数组的交集_哔哩哔哩_bilibili
思路:先遍历nums1,把所有出现的数字存到HashSet,之后再遍历nums2,把不在nums2里面的数字从set里面删掉,怎么给数组初始化大小呢?
尝试
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
int count = 0;
HashSet<Integer> set = new HashSet<>();
HashMap<Integer,Integer> result = new HashMap<>();
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])&&result.get(nums2[i])!=1){
result.put(nums2[i],1);
}
}
int[] array = new int[count];
int i=0;
for (Integer key : result.keySet()) {
Integer value = result.get(key);
array[i++]=value;
}
return array;
}
}
收获
- 我靠❗可以直接用 set.size() 来获取Set的大小,作为数组的大小
- 集合可以直接转换为数组
-
return resSet.stream().mapToInt(x -> x).toArray();
202.快乐数
视频讲解:无
思路:每次要拆分数字,再求平方,感觉要递归,要怎么知道是无限循环呢,true的情况岂不是一直出不来了,搞不懂,没有思路,可能是数学上有些信息我读不出来
收获
- 题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!(我完全没有读出这一层意思)
- 取出每个位置的数字求平方和
-
private int getNextNumber(int n) { int res = 0; while (n > 0) { int temp = n % 10; res += temp * temp; n = n / 10; } return res; }
1.两数之和
视频讲解:Leetcode:1.两数之和,学透哈希表,map使用有技巧!_哔哩哔哩_bilibili
思路:之前刷过这道题,先用Map存储元素和对应下标,遍历数组,每次用target - nums[i]得到gap,判断gap是否在map里面,不再就把当前元素放入map,在的话就返回当前元素下标,以及从map里面取出gap元素的下标
复习
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> temp = new HashMap<>();
for(int i=0;i<nums.length;i++){
int gap = target - nums[i];
if(temp.containsKey(gap)){
return new int[]{i,temp.get(gap)};
}else{
temp.put(nums[i],i);
}
}
return null;
}
}
收获
- 初始化数组元素要用中括号!:int anOtherArray[] = new int[] {1, 2, 3, 4, 5};