【算法第四天7.17】有效的字母异位词,两个数组的交集,快乐数,两数之和

文章介绍了使用哈希表解决LeetCode中的四道题目:检查字母异位词的有效性,找到两个数组的交集,判断快乐数以及寻找两数之和。每种方法都利用了哈希数据结构,如数组和Set,来优化解决方案,确保复杂度降低并避免重复计算。

链接力扣242-有效的字母异位词
思路
1、把其中一个串的字符映射到数组也就是哈希表的索引下标
2、将某字母在串中出现的次数当作value值
3、最后,验证value值是否全为0

class Solution {
    public boolean isAnagram(String s, String t) {
        // 定义一个以26个字母的ASC||值为key的数组
        int[] record = new int[26];
        // 让s里的每一个字母为key,其出现次数为value,形成一个字典
        for(int i = 0; i < s.length(); i++){
            // 如果是字母a,则record[0]++,以此类推
            record[s.charAt(i) - 'a']++;
        }
        // 对s做好的字典,让t进行减操作,一但出现value非0,则说明出现次数有不同
        for(int i = 0; i < t.length(); i++){
            record[t.charAt(i) - 'a']--;
        }
        for(int i = 0; i < record.length; i++){
            if(record[i] != 0) return false;
        }
        return true;
    }
}

链接力扣343-两个数组的交集
思路
1、根据题意,需要是交集数字,并且不能重复(重复两也算一个),其它重复的也要算
2、先将其中一个数组放入set中,再检验另一个数组是否包含,若同样包含的,放入另一个set中
3、最后将结果set转为数组,并返回

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> nums1set = new HashSet<>();
        Set<Integer> resset = new HashSet<>();
        for(int num1:nums1){
            nums1set.add(num1);
        }
        for(int num2:nums2){
            if(nums1set.contains(num2)){
                resset.add(num2);
            }
        }
        // 最后要转化为数组,数组一要有索引,二要有值
        // int j = 0;
        // int[] res = new int[resset.size()];
        // for(int num:resset){
        //     res[j++] = num;
        // }
        // return res;
        return resset.stream().mapToInt(x -> x).toArray();
    }
}

链接力扣202-快乐数
思路
1、此题重点:如果不到1,则会无限循环,只要判断n在不断求和过程中,这个sum会不会重复出现即可
2、从第一个数开始,直到1,中间得到的每一个sum都放入set中,一但有重复的,说明这个数不是快乐数
3、while循环条件:sum不为1且set中不包含sum,一旦跳出循环,说明不满足上述两条件,true或者false

class Solution {
    public boolean isHappy(int n) {
        // 此题重点:如果不到1,则会无限循环,只要判断这个sum会不会重复出现即可
        Set<Integer> record = new HashSet<>();
        // 从第一个数开始,直到1,中间得到的每一个数都放入set中,一但有重复的,说明这个数不是快乐数
        int tmp = n;
        // 循环条件为:tmp不为1且set中不包含tmp
        // 一旦跳出循环,说明不满足上述两条件,true或者false
        while(tmp != 1 && !record.contains(tmp)){
            record.add(tmp);
            tmp = getSum(tmp);
        }
        return tmp==1;
    }
    public int getSum(int n){
        int res = 0;
        while(n > 0){
            int tmp  = n % 10;  //取余得到末位数
            res += tmp * tmp;
            n = n / 10;       
        }
        return res;
    }
}

链接力扣1-两数之和
思路
1、需要用hashmap,key为nums数组的值,value是索引,因为最后结果是索引
2、在一个for循环需要处理两个事,一是如果map包含target-nums[i],则直接返回这两个数的索引,也就是map的值
二是如果不包含,则需要将当前数字放入map中

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();
        // int[] res = new int[2];
        for(int i = 0; i < nums.length; i++){
            if(map.containsKey(target-nums[i])){
                return new int[]{map.get(target-nums[i]),i};
            }else{
                map.put(nums[i],i);
            }
        }
        return new int[2];
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值