重生之我在代码随想录刷算法第五天 |242.有效的字母异位词、 349. 两个数组的交集、第202题. 快乐数、 1. 两数之和

参考文献链接:代码随想录

本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。

242.有效的字母异位词

[力扣题目链接]

解题思路

这道题目思路还是比较好想的,如果没有了解过哈希表基础的可以到代码随想录网站,上面有详细的讲解。

当遇到题目中说要寻找某个元素在不在某个元素里的时候就要想到哈希表,那么究竟用什么数据结构呢?

这道题目数组就很合适,数组的缺点是害怕浪费空间,但我们这道题目只有26个字母不会开辟很多空间。

所以我们的思路就是开辟一个26长度的数组,然后将第一个字符串遍历,哪个字母出现就在哪个位置+1,这样数组的值就代表某个字母出现的次数。然后再遍历第二个字符串,哪个字母出现就在哪个位置-1,最后遍历数组看是否每个值都为0。因为如果字符串中出现的字母相同加的就会减完。

代码示例
class Solution {
    public boolean isAnagram(String s, String t) {
        int[] hashArray = new int[26];
        for(int i = 0;i<s.length();++i){
            hashArray[s.charAt(i) - 97]++;
        }
        for(int i = 0;i<t.length();++i){
            if(hashArray[t.charAt(i) - 97]-- < 0){
                return false;
            }
        }
        for(int i = 0;i<hashArray.length;++i){
            if(hashArray[i] != 0){
                return false;
            }
        }
        return true;
    }
}

349. 两个数组的交集

[力扣题目链接]

解题思路

这道题目是求交集,其实也就是求第二个数组中的元素存不存在于第一个数组,所以还是用哈希表。

这道题目数字范围到1000,所以不能用数组,用Set集合。

代码示例
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        List<Integer> resultList = new ArrayList<>();
        Set<Integer> hashSet = new HashSet<>();
        //把第一个数组中的数都放入Set集合
        for(int i = 0;i<nums1.length;++i){
            hashSet.add(nums1[i]);
        }
        //遍历第二个数组,如果存在于set中就把他加入到结果集
        for(int i = 0;i<nums2.length;++i){
            if(hashSet.contains.(nums2[i])){
                resultList.add(nums2[i]);
            }
        }
        //结果list转为数组并返回
        int[] result = new int[resultList.size()];
        int count = 0;
        for(Integer res:resultList){
            result[count++] = res;
        }
        return result;
    }
}

202题. 快乐数

力扣题目链接

解题思路

这道题目是说要看每次算出的sum是不是1,或者是不是无限循环,无限循环的意思就是会出现sum相同的情况,所以这是查找一个数是否出现,所以得用哈希表。数量很多所以我们还是用Set

代码示例
class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        //把每次算出的sum存入set中然后每次判断是否重复即可。
        while(true){
            int sum = 0;
            while(n/10 != 0){
                sum += (n % 10)*(n % 10);
                n = n/10;
            }
            sum += n*n;
            if(set.contains(sum)){
                return false;
            }
            if(sum == 1){
                return true;
            }
            set.add(sum);
            n = sum;
        }
    }
}

1. 两数之和

力扣题目链接

解题思路

这道题目暴力解法肯定是ok的,两层循环找就可以了,但有没有更简单的办法?

当然有,如果我们换种方式理解题目就好了。

题目中的意思是要找1+2等于3,那我们用目标值3-其中一个数2 = 1,说明此刻如果数组中有数字1那么就满足题意。

其实也就是把题目改为了3-2等于的数存不存在于数组中。如果存在,那么不就有1,2加起来等于目标值了。

因此我们只需要把target-数组值的数存入map,<差值,数组下标>。

然后去遍历数组看某个数是否是某个map集合的key,如果是的话就返回map的value和当前数组下标就好了。

最后一定注意题目中说不可以两次使用一个元素,所以还要加一个判断哦!

代码示例
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();
        int[] result = new int[2];
        //把target-数组中的数都存入map
        for(int i = 0;i<nums.length;i++){
            int temp = target - nums[i];
            map.put(temp,i);
        }
        //重新遍历数组,看是否与数组中的数有重复
        for(int i = 0;i<nums.length;i++){
             if(map.containsKey(nums[i])){
                result[0] = map.get(nums[i]);
                result[1] = i;
                if(result[0] != result[1]){
                    break;
                }
             }
        }
        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值