242. 有效的字母异位词|349. 两个数组的交集|202. 快乐数|1. 两数之和||【算法学习笔记】

157 阅读3分钟

242. 有效的字母异位词

要求是给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

🍅 数组解法(哈希表),即使用一个数组存储每个字母出现的次数,相比较看两个字符串是否组成元素相同

要注意的是在java中数组的length不用加(),字符串的length要加()。另外要理解的是s.chatAt()函数的作用是获取字符串对应下标的值,那么-'a'后就可以理解成每个字母的索引,a对应的就是0,++和--代表对应元素的数量。

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. 两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

🍅 集合解法(哈希表),即使用两个集合,一个集合录入数组的元素,另一个集合用来输出交集,最后把集合转换成数组

做这道题之前要掌握的是java集合不能存放基本数据类型,只能存放对象的引用,如int--integer。还有就是mapToInt()函数作用是把哈希表元素类型转为int,函数体里面是转换的格式。

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> set1 = new HashSet<>();   //set1用来遍历数组1
    Set<Integer> set2 = new HashSet<>();   //set2用来输出交集(集合不允许重复,自动去重)
    for (int i: nums1) {
        set1.add(i);
    }
    for (int i: nums2) {
        if (set1.contains(i)) {
            set2.add(i);
        }
    }
    
    return set2.stream().mapToInt(q->q).toArray();    //把集合转为数组
    }
}

202. 快乐数

要求是给一个数,通过求每个位置上的数平方和是否为1来判断是不是快乐数

🍅 集合解法(哈希表),即用一个集合统计平方和,看最后结果是否为1

因为可能无限循环n无法变成1,所以用集合可以防止元素重复。

class Solution {
    public boolean isHappy(int n) {
    Set<Integer> set1 = new HashSet<>();
    //当出现重复元素或者平方和已经等于1,则退出循环
    while (n != 1 && !set1.contains(n)) {
        set1.add(n);
        n=getnextnumber(n);
    }
    return n == 1;
    }

    //定义函数得到下个平方和
    int getnextnumber(int n) { 
        int res = 0;
        while(n > 0){
            int x = n%10;
            res += x*x;
            n = n/10;
        }
        return res;
    }
}

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标

🍅 map解法(哈希表)解法,即通过使用map的key和value,判断和target的差值是是否出现过,如果出现,返回它们的下标位置。

这道题要求是我们判断差值是否出现在集合里,所以想到用哈希表的方式来解题。并且还要返回下标,所以使用map。要注意的是map的key放的是数组的值,value放的是数组的下标,因为要迅速判断和taget的差值是否出现过和结果返回的是下标位置。

class Solution {
    public int[] twoSum(int[] nums, int target) {
    //用数组记录要返回的下标位置
    int res[]=new int[2];
    if(nums == null||nums.length == 0){
        return res;
    }
    //定义map结构
    Map<Integer,Integer> map = new HashMap<>();
    for(int i=0;i<nums.length;i++){
        int temp=target-nums[i];       //定义temp表示和目标的差值
        if(map.containsKey(temp)){     //如果满足条件就把下标放入数组中
        res[0]=i;
        res[1]=map.get(temp);
        }
    map.put(nums[i],i);                //将元素的值和下标放入图,继续向后遍历
    }
    return res;
}
}

如果对哈希表数据结构不熟悉,这边推荐卡哥的网站,里面有文字讲解和视频。我也是跟着卡哥学习的。