【算法笔记】两个数组的交集|快乐数

两个数组的交集

问题

给定两个数组,编写一个函数来计算它们的交集。

问题分析

数组的交集,也就是两个数组中相同元素组合而成的集合,那么我们通过遍历取出相同元素就行了。
但是原数组中可能存在多个相同的元素,而我们的交集中应该只有唯一一个两数组的都存在的元素,所以我们需要进行处理来排除交集中出现重复的数。
使用哈希表就能解决问题,将数组的元素映射到HashSet中,HashSet中的数值是唯一的。

  • 将一个数组映射到HashSet中
  • 然后将另一个数组映射到另一个HashSet中,映射过程中判断该元素是否出现在第一个HashSet中,如果是在放入,不是则不放入,新的这个HashSet就是数组的交集

代码

public class Intersection {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set hashTable1=new HashSet();
        Set hashTable2=new HashSet();
        int n=0;
        
        //把nums1映射到hashTable1中
        for(int i : nums1){
            hashTable1.add(i);
        }
        
        //遍历nums2,获取交集
        for(int i : nums2){
            //判断hashTable1中是否存在该元素
            if(hashTable1.contains(i)){
                //存在放入交集
                hashTable2.add(i);
            }
        }
        
        //把交集元素放入数组中
        int []result=new int[hashTable2.size()];
        for(Object i : hashTable2){
            result[n++]= (int) i;
        }
        return result;
    }
}

快乐数

问题

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

问题分析

该问题就是对一个数进行特殊的换算,再将换算结果以同样的方式换算,一直进行。这个换算过程是取数的每个位置上的数字的平方和。
换算过程的代码为:

 public int conversion(int num){
     int sum=0;//保存平方和
     //通过循环去对每个位置上的数做平方
     while(num>0){
         sum+=(num%10)*(num%10);
         num/=10;
     }
     return sum;
 }

然后解决在换算过程中可能出现的情况

  • 出现无限循环,在某次换算之后的结果是以前出现过的,所以再进行下去就是死循环了,不是快乐数,返回false。
    **处理死循环:**也就是判断这个数是否在以前已经存在过,那么我们可以使用集合将之前运算的结果保存下来,然后每次算出结果后先判断是否出现在集合里面,是则结束运算,返回false。
  • 没有死循环,得到最后结果为1,是快乐数,返回true。

代码

public class IsHappy {

    //进行运算
    public int conversion(int num){
        int sum=0;
        while(num>0){
            sum+=(num%10)*(num%10);
            num/=10;
        }
        return sum;
    }

    public boolean isHappy(int n) {
        //集合保存结果
        Set<Integer> result=new HashSet<>();
        //进行一次运算后的值
        int changeN=conversion(n);
        //判断运算后的结果是否出现在集合里
        while(!result.contains(changeN)){
            //结果为1,为快乐数返回true
            if(changeN==1){
                return true;
            }
            //将结果保存到集合里
            result.add(changeN);
            //做一次运算
            changeN=conversion(changeN);

        }
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值