前言
通过前面博客的学习,我们对哈希表的结构有了初步的理解,以及会一些哈希表的简单的使用,今天我们继续通过做题的方式巩固基础并进行进一步的学习.
示例完成
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;
}
}