代码随想录算法训练营第六天|#242.有效的字母异位词、#349. 两个数组的交集、#202. 快乐数、#1.两数之和

41 阅读2分钟

242.有效的字母异位词

题目链接

解题思路:本题就是考察哈希表数组的运用,难度不大

解题代码:

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 count : record){
            if(count != 0){
                return false;
            }
        }
        return true;
    }
}

349. 两个数组的交集

题目链接

解题思路:主要是针对哈希表中的set的运用。

将数组1保存在 set 中,遍历数组2,判断数组2中的元素是否出现在 set 中,出现即为符合题目条件的元素,放进返回结果的 set 中。

注意:需要把 set 对象转成 数组对象 返回 可以用 stream().mapToInt(a -> a).toArray() 进行转换

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if(nums1 == null || nums1.length == 0 ||
         nums2 == null || nums2.length == 0){
             return new int[0];
         }
         Set<Integer> set = new HashSet<>();
         Set<Integer> finalSet = new HashSet<>();
         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])){
                 finalSet.add(nums2[i]);
             }
         }
         return finalSet.stream().mapToInt(a -> a).toArray();
    }
}

202. 快乐数

题目链接

解题思路:本题的关键点在于可能会出现 无限循环,也就是说求和的过程中,sum会重复出现

同时对于处理 n 的 十位数 和 个位数 需要仔细理解

解题代码:

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> record = new HashSet<>();
        //n 不能等于1 并且 set集合里面也不包含 n
        while(n != 1 && !record.contains(n)){
            //set 集合记录每一次变化的后的 n
            record.add(n);
            n = getNextNumber(n);
        }
        return n == 1;
    }
    public int getNextNumber(int n){
        //定义 sum 计算和
        int sum = 0;
        while(n > 0){
            //求出 n 十位的数字
            int temp = n % 10;
            sum += temp * temp;
            //求出 n 个位的数字
            n = n /10;
        }
        return sum;
    }
}

1.两数之和

题目链接

解题思路:考察对哈希表中 map 的使用,理解 map 中的键值对存放什么非常重要!!!

map 中的:

  • key ----> 出现的数字
  • value ----> 出现数字对应的下标

遍历数组的时候需要去map中寻找 (目标值 - 当前遍历的值)是否在 map 中

解题代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        if(nums == null || nums.length == 0){
            return res;
        }
        //定义一个map  k - 数字 v - 数字对应的下标
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0;i < nums.length;i++){
            int n = target - nums[i];
            //判断当前 map 里是否有 (目标值 - 当前值)
            if(map.containsKey(n)){
                //如果有就存入数组
                res[0] = i;
                res[1] = map.get(n);
                break;
            }
            //没找到就将当前这个数和对应下表存入map
            map.put(nums[i],i);
        }
        return res;
    }
}