242.有效的字母异位词
该题目就是统计原字符串和目标字符串的词频,看词频是否相同。所以就需要记录字符串的词频进行比较,根据记录词频的方式不同,这个题也就有了多种写法,首先是数组记录词频的写法,其次是Map记录词频的写法。
数组记录词频法:
class Solution {
public boolean isAnagram(String s, String t) {
int[] record = new int[26];
for(int i = 0; i < s.length(); i++){
record[s.charAt(i) - 'a']++;
}
for(int i = 0; i < t.length(); i++){
record[t.charAt(i) - 'a']--;
}
for(int i : record){
if(i != 0) return false;
}
return true;
}
}
map记录词频法:
class Solution {
public boolean isAnagram(String s, String t) {
HashMap<Character,Integer> map = new HashMap<>();
for(int i = 0; i < s.length(); i++){
if(map.containsKey(s.charAt(i))){
map.put(s.charAt(i),map.get(s.charAt(i)) + 1);
}
else{
map.put(s.charAt(i),1);
}
}
for(int i = 0; i < t.length(); i++){
if(map.containsKey(t.charAt(i))){
map.put(t.charAt(i),map.get(t.charAt(i)) - 1);
if(map.get(t.charAt(i)) == 0){
map.remove(t.charAt(i));
}
}
else{ // 包含不存在的字符
return false;
}
}
if(map.isEmpty()) return true;
return false;
}
}
349. 两个数组的交集
这个题还是类似统计词频,只不过只是统计是否出现过,因为不需要统计频率,所以用HashSet明显要比HashMap要好。需要重点记忆的点是,最后的Stream流操作。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> record = new HashSet<>();
HashSet<Integer> ans = new HashSet<>();
for(int i = 0; i < nums1.length; i++){
if(!record.contains(nums1[i])) record.add(nums1[i]);
}
for(int i = 0; i < nums2.length; i++){
if(record.contains(nums2[i])) ans.add(nums2[i]);
}
return ans.stream().mapToInt(x -> x).toArray();
}
}
202.快乐数
这个题使用HashMap主要是为了判断,当前的数是否可能成为快乐数,如果这个数变换之后的数以前出现过,就说明出现了循环,也就不可能成为快乐数了。
class Solution {
public boolean isHappy(int n) {
HashSet<Integer> resultset = new HashSet<>();
while(n != 1 && !resultset.contains(n)){
resultset.add(n);
n = change(n);
}
if(n == 1) return true;
else return false;
}
public int change(int n){
int result = 0;
while(n > 0){
result += Math.pow((n % 10),2);
n /= 10;
}
return result;
}
}
1.两数之和
两数之和,万恶之源了属于是,这个题同样可以通过HashMap来实现。分别记录下标以及和某个元素配对所需要的值。这样当所需要的值出现的时候,就可以直接拿到两个符合条件的下标将其输出。
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] res = new int[2];
HashMap<Integer,Integer> record = new HashMap<>(); // key值 value下标
for(int i = 0; i < nums.length; i++){
if(!record.containsKey(target - nums[i])){
record.put(nums[i], i);
}
else{
res[0] = record.get(target - nums[i]);
res[1] = i;
}
}
return res;
}
}