算法学习之哈希表


前言

通过前面博客的学习,我们对哈希表的结构有了初步的理解,以及会一些哈希表的简单的使用,今天我们继续通过做题的方式巩固基础并进行进一步的学习.


示例完成

1.快乐数

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

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

其实思想很简单,一个数无非就两种情况,要么是快乐数,要么不是快乐数,若符合快乐数,那么它不断计算下去一定会等于1,否则就只能无限循环了,那无限循环需要满足什么条件呢?即同一个数出现两次或以上,例如这样:

在这里插入图片描述
其实我们都会发现,凡是进入到这个循环中的数,那么必定不是快乐数,如何处理出现的重复元素,对了!用Set容器,于是构建如下代码:

/**若不是快乐数,那么就会出现重复的数据,导致环内循环
快乐数每一次出现的平方数注定是只会出现一次的,故可以用Set集合解决
 */
class Solution {
    public boolean isHappy(int n) {
        Set<Integer> repeatSet=new HashSet<Integer>();

        int temp=0;
        boolean flag=false;         //查看是第几次判断
        while(true){
            if(flag){
                n=temp;
                temp=0;
            }
            flag=true;				//使用flag主要是第一次的n不能重置
            while(n!=0){
                int m=n%10;
                temp=m*m+temp;
                n/=10;
            }
            if(temp==1)
                return true;
            else{
            	//若哈希表中不存在,那么添加进去,否则直接返回false
                if(!repeatSet.contains(temp))
                repeatSet.add(temp);
                else
                return false;
            }
        }
    }
}

2.四数相加II

题目:

给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。
为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500, 所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        //key---放两数之和,value存放两数之和出现的次数
        Map<Integer,Integer> map=new HashMap<>();

        int temp=0;
        int res=0;

        //先计算两个数组之间的表
        for(int i=0;i<nums1.length;i++){
            for(int j=0;j<nums2.length;j++){
                temp=nums1[i]+nums2[j];
                map.put(temp,map.getOrDefault(temp,0)+1);
            }
        }

        //再计算另外两个数的和,查看是否与map相加为0的情况,同时记录次数
        for(int number1:nums3){
            for(int number2:nums4){
                temp=number1+number2;
                //temp+x=0--->x=0-temp
                if(map.containsKey(0-temp))
                    res+=map.get(0-temp);
            }
        }

        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Astronaut_001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值