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

LeetCode 242 有效的字母异位词

代码随想录算法训练营Day5 | 242.有效的字母异位词、349.两个数组的交集、202.快乐数、1. 两数之和_第1张图片
本题思路:我们只需要分别统计,字符串 s ,字符串 t 中每个字符的出现次数,分别用两个数组来存储,然后再循环遍历对比两个数组中相同位置出现的次数,如果有不同的则返回 false。
代码随想录算法训练营Day5 | 242.有效的字母异位词、349.两个数组的交集、202.快乐数、1. 两数之和_第2张图片
统计完之后,然后一一对比 arrayS 和 arrayT,出现次数,判断,这两个字符是有效的字母异位词代码随想录算法训练营Day5 | 242.有效的字母异位词、349.两个数组的交集、202.快乐数、1. 两数之和_第3张图片

class Solution {
    public boolean isAnagram(String s, String t) {
        // 本题思路,从头到尾遍历,每个字符串中,每个字母出现的次数然后作对比,如果相同,说明字母异位词
        int lenS = s.length();
        int lenT = t.length();
        int[] arrayS = new int[123];
        int[] arrayT = new int[123];
        for(int i= 0; i < lenS ; i++){
            arrayS[s.charAt(i) - '0']++; 
        }
        for(int i = 0; i< lenT; i++){
            arrayT[t.charAt(i) - '0']++;
        }
        for(int i =0; i< arrayS.length;i++){
            if(arrayS[i] != arrayT[i]){
                return false;
            }
        }
        return true;
    }
}

LeetCode 349 两个数组的交集

代码随想录算法训练营Day5 | 242.有效的字母异位词、349.两个数组的交集、202.快乐数、1. 两数之和_第4张图片
本题思路:两个数组的交集,我们可以使用 set 集合,来解决这道题。首先将其中一个数组 nums1的值,存储到 set1 中,由于 set 会自动去重,所以存进去的元素是去重以后的元素。然后遍历 nums2中的所有元素,判断是否在 set1 中存在过,如果存在就存到到 set2 中。遍历完以后,set2 中存储的就是两个数组的交集。然后创建一个 ans 数组,将 set2 中元素一一赋值给 ans,最后返回 ans 数组。
代码随想录算法训练营Day5 | 242.有效的字母异位词、349.两个数组的交集、202.快乐数、1. 两数之和_第5张图片

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        // 先将其中一个数组存入 set 中
        Set<Integer> set1 = new HashSet();
        for(int i = 0; i < nums1.length; i++){
            set1.add(nums1[i]);
        }
        Set<Integer> set2 = new HashSet();
        for(int i = 0; i < nums2.length; i++){
            if(set1.contains(nums2[i])){
                set2.add(nums2[i]);
            }
        }
        int[] ans = new int[set2.size()];
        int j = 0;
        for(int o : set2){
            ans[j++] = o;
        }
        return ans;
    }
}

LeetCode 202 快乐数

代码随想录算法训练营Day5 | 242.有效的字母异位词、349.两个数组的交集、202.快乐数、1. 两数之和_第6张图片
本题思路:就是输入一个数字 n ,我们要得到 下一个数字是什么,就需要写出一个函数,来得到下个数。 得到下个数后来判断是否为1,因为题目说了,有可能无线循环,那么我们循环判断的时候,就不能只是 while (res != 1)了,在这个循环体内部,应该加入一个 Set 集合,来将每一个结果记录下来。如果出现重复就直接 返回 false,如果出了循环,说明 res=1了,直接返回 true 即可。

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet();
        int res = getNextNumber(n);
        while(res != 1){
            if(!set.contains(res)){
                set.add(res);
            }else{
                return false;
            }
            res = getNextNumber(res);
        }
        return true;
    }
        // 思路,就是输出一个数字 ,要找它的下一数,方便后续判断
    public static int getNextNumber(int n){
        int sum = 0;
        while( n != 0){
            sum += (n % 10) * (n % 10);
            n = n / 10;
        }
        return sum;
    }
}

注意:本题只要能够,写出 getNextNumber 方法,就基本完成一大半了。这个方法的逻辑,可以代代数字体会一下。


LeetCode 1 两数之和

代码随想录算法训练营Day5 | 242.有效的字母异位词、349.两个数组的交集、202.快乐数、1. 两数之和_第7张图片
本题思路:使用 map 集合,遍历整个数组,首先将数组的第一个元素存进去 map 中,map.put(nums[0],0),Key是 值,Value是 下标。
从下标为 1 的元素开始遍历,判断条件是 target - nums[i] 的值是否存在 map 中,
如果包含,直接返回 当前 下标,和 target - nums[i] 的下标即可。
如果不包含,则将 nums[i] 存入 map 中。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        // 利用 map 把所有的元素依次存入,每次存入一个判断 target - nums[i] 的值,存不存在 map中
        Map<Integer,Integer> map = new HashMap();
        map.put(nums[0],0);
        int[] res = new int[2];
        for(int i = 1; i < nums.length; i++){
            // 如果 map 中有  target - nums[i] ,说明符合题意
            if(map.containsKey(target - nums[i]) ){
                res[0] = i;
                res[1] = map.get(target - nums[i]);
                return res;
            }
            map.put(nums[i],i);
        }
        return res;
    }
}

下面用示例2,画个图来分析下这个流程,方便更加理解代码
代码随想录算法训练营Day5 | 242.有效的字母异位词、349.两个数组的交集、202.快乐数、1. 两数之和_第8张图片

你可能感兴趣的:(代码随想录,算法,散列表)