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

leetcode 242.有效的字母异位词 、349. 两个数组的交集 、202. 快乐数、1. 两数之和 。
leecode 242.有效的字母异位词
题目链接 :https://leetcode.cn/problems/valid-anagram/description/
题目

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

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:

输入: s = “rat”, t = “car”
输出: false

解题思路

这道题有是哈希表的应用,有多种解法,因为对于哈希表,也可以用数组来表示。那这道题主要是是判断给出的两个字符串是否有同样数量的字符组成,那我们直接用哈希表去记录某一个字符串的所以要字符,然后再去遍历另一个字符串就好了。如果用数组的话就更简单了,对一个字符串进行遍历后,进行映射,再对另一个字符串遍历时,进行相减,然后判断数组是否有不为0的元素。具体可看代码:

//哈希表
class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) return false; //两个数组长度不一致,肯定不是字母异位词
        HashMap<Character,Integer> map = new HashMap<>(); 
        for (char c : s.toCharArray()) { //map去映射字符串的值,遇到相同的,值加一,后面去遍历另一个字符串时,值减1
            map.put(c,map.getOrDefault(c,0) + 1);
        }
        for (char c : t.toCharArray()) {
            if (!map.containsKey(c)) return false; //不在map中,不是字母异位词
            map.put(c,map.get(c) - 1); //在map记录中,值减一
        }
        for (char c :map.keySet()) { //最后对map进行遍历,如果有key对应的value大于0,肯定不是字母异位词,因为上面已经遍历完两个字符串,如果是字母异位词,那map里面记录的key对应的value肯定是0
            if (map.get(c) > 0) return false;
        }
        return true; //上面代码走完,都没返回false,那两个字符串就是字母异位词。
    }
}

用数组的话注意字符怎么转化为的数字的映射,然后解题的思路是差不多的,先相加后相减。具体代码为:

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']++;     // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
        }

        for (int i = 0; i < t.length(); i++) {
            record[t.charAt(i) - 'a']--;
        }
        
        for (int count: record) {
            if (count != 0) {               // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
                return false;
            }
        }
        return true;                        // record数组所有元素都为零0,说明字符串s和t是字母异位词
    }
}
知识点

数组,哈希表

注意事项

如何用哈希表去进行遍历操作,如何用数组去映射。

相关题目
  1. 字母异位词分组
leecode 349 两个数组的交集
题目链接 :https://leetcode.cn/problems/intersection-of-two-arrays/description/
题目

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

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

解题思路

这道题跟上面的题是类似的,都是哈希表的应用。这道理是求两个数组的交集,那我们直接用哈希表去将一个数组的值作为哈希表的键,然后去遍历另一个数组,如果遍历到的值在哈希表的键中,那不就是相交的值吗,因为可能一个值在数组中多次存在,所以我们可以用set去保存相交的值,最后再转化为数组。具体实现可看代码:

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        HashMap<Integer,Integer> map = new HashMap<>();
        HashSet<Integer> set = new HashSet();
        for (int num : nums1) {
            map.put(num,map.getOrDefault(num,0) + 1);   //将nums1的值用哈希表的键记录
        }
        for (int num : nums2) {
            if (map.containsKey(num)) set.add(num); //相交的值,用set记录
        }
        int[] res = new int[set.size()];
        int index = 0;
        for (int num : set) {  
            res[index++] = num; //将set集合元素用数组记录,因为题目要求返回的是数组格式。
        }
        return res;
    }
}
知识点

哈希表

注意事项

怎么对重复的相交元素进行去重

相关题目
  1. 两个数组的交集 II
leecode 202 快乐数
题目链接 :https://leetcode.cn/problems/happy-number/description/
题目

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:
输入:n = 2
输出:false

解题思路

这道题得对题目读多几遍,如果不是快乐数,那在循环的过程中会出现相同的元素,这里就要判断当前的这个元素是否出现过,那我们就想到用到哈希表了。因为判断一个元素是否出现过用哈希表的操作是比较方便直接的。然后这道题还有一个点就是对一个数字的个位数操作,这个数字对10取余,即n % 10,相当于取个位数,然后对n = n / 10,即去掉个位数,再次对10取余,反复上述的操作。可以在纸上推导一下。具体实现代码为:

class Solution {
    public boolean isHappy(int n) {
        HashSet<Integer> res = new HashSet<>(); 
        while (n != 1) { //n==1时跳出循环
            if (!res.add(n)){ 
                return false;  //当元素出现过,立即返回false
            }
            n = add(n);  //更新n
        }
        return true; //n==1,是快乐数
    }
    public  int add(int n) { //取数值各个位数的和
        int sum = 0;
        while (n > 0) {
            int dig = n % 10;
            sum += dig * dig;
            n = n / 10;
        }
        return sum;
    }
}
知识点

哈希表,数字个位数的操作

注意事项

对数字各个位数的操作

相关题目
  1. 各位相加
leecode 1 两数之和
题目链接 :https://leetcode.cn/problems/two-sum/description/
题目

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]

解题思路

这道题是leetcode的第一题,有多种解法,我这里用哈希表解决。即用取遍历数组时,用哈希表去找target与遍历到的元素之差diff是否在哈希表中,在的话,去哈希表中去diff的值,不存在则将其存入哈希表中。即哈希表记录的键key是数组各个下标的值,value的其在数组对应的下标。具体实现可看代码

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer,Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int diff = target - nums[i]; //差值
            if (map.containsKey(diff)){ //存在哈希表中
                return new int[]{map.get(diff),i}; //返回下标
            }else {
                map.put(nums[i],i); //不存在,记录在哈希表中,key记录num[i],value记录i
            }
        }
        return new int[]{-1,-1}; //没有满足的两个元素
    }
}
知识点

哈希表

注意事项

哈希表的key-value分别记录的是什么

相关题目

15 .三数之和
18 .四数之和

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值