leetcode-zgd-day6-242.有效的字母异位词/349. 两个数组的交集/202.快乐数/1.两数之和

1,032 阅读1分钟

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;
     }
 }