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

242、有效的字母异位词

题目链接:有效的字母异位词

这道题考的是哈希表,通过将两个数组当成哈希表的下标,当出现一次下标后就哈希表值自增,而遍历第二个数组时就自减,如果哈希表为0,就说明这是有效字母异位。而对于这道题我一开始先学习了哈希表后,第一个想到的是用他们的ASCII码,但是相同的ASCII码会有不同的元素构成。

class Solution {
    public boolean isAnagram(String s, String t) {
        int [] hasharr=new int [26];
        char [] a=s.toCharArray();
        char[] b=t.toCharArray();
        for(char i:a)
        {
            hasharr[i-'a']++;
        }
        for(char j:b)
        {
            hasharr[j-'a']--;
        }
        for(int f:hasharr)
        {
            if(f!=0)
            {
                return false;
            }
        }
        return true;
    }
}

349、两个数组的交集

题目链接:两个数组的交集

这个我想了好久,我的想法是当遍历第1个数组时设定限制条件,每个元素的哈希值都不能大于1,遍历第二个数组时设定只有当前数组元素在哈希表中的值为1的才可以被录入哈希表,最后返回哈希表值为2的下标。注意:小心溢出

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
         int [] hasharr=new int [1001];
         
         for(int i:nums1)
         {
           if(hasharr[i]<1)
           {
               hasharr[i]++;
           }
         }
         int m=0;
         for(int j:nums2)
         {
             if(hasharr[j]==1)
             {
                 hasharr[j]++;
                 m++;
             }
         }
         
         int [] hashp=new int [m];
         for(int k=0;k<hasharr.length;k++)
         {
             if(hasharr[k]==2)
             {
                hashp[--m]=k;
             }
            
         }
         return hashp;


    }
}

202、快乐数

题目链接:快乐数

老实说,这个快乐数真的让人不快乐、这个我想了好久。第一要求出每个位的平方之和,第二要将其放入哈希表中,如果出现了无限循环,也就是哈希表中有值是大于1的就不是快乐数。

class Solution {

    public boolean isHappy(int n) {
        Set<Integer> set=new HashSet<>();
       while(n!=1)
       {
           if(set.contains(n))
           {
               return false;
           }
           set.add(n);
           n=geshuhe(n);
       }
       return true;
    }
     int geshuhe(int f)
    {
        int sum=0;
        while(f>0)
        {
            sum+=(f%10)*(f%10);
            f=f/10;
        }
        return sum;
    }
}

1.两数之和

题目链接:两数之和

这道题是老盆友了,今天用的是哈希map来解决的,通过hashmap的键值对将遍历过的值存储起来,在不断先前遍历的过程中,判断是否后面有值是可以相加为目标值,若没有,则将其存入hashmap中。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer,Integer> map=new HashMap();
        int m=0;
        int [] arr=new int [2];
        for(int i=0;i<nums.length;i++)
        {
            m=target-nums[i];//数组的值为键
            if(map.containsKey(m))//获得键的值=下标
            {
                arr[0]=i;
                arr[1]=map.get(m);
            }
            map.put(nums[i],i);
        }
        return arr;


    }
}

总结:今天学习了哈希表,平日里对于哈希表只是一知半解,今天算是有一个较为清晰的理解了,只不过是第一次用哈希表解题,写的时间很长。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值