两个数组的交集
问题
给定两个数组,编写一个函数来计算它们的交集。
问题分析
数组的交集,也就是两个数组中相同元素组合而成的集合,那么我们通过遍历取出相同元素就行了。
但是原数组中可能存在多个相同的元素,而我们的交集中应该只有唯一一个两数组的都存在的元素,所以我们需要进行处理来排除交集中出现重复的数。
使用哈希表就能解决问题,将数组的元素映射到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;
}
}