哈希表 快乐数
题目
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
示例:
输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
解法一:利用哈希表特性
1.判断是否存在
class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
set.add(n);
while (true){
n = create(n);
if(n == 1)
return true;
if(set.contains(n))
return false;
set.add(n);
}
}
private int create(int n) {
int sum = 0;
while (n != 0){
sum += n % 10 * (n % 10);
n /= 10;
}
return sum;
}
}
2.判断是否为1.否则继续做循环,重复出现则跳出循环
class Solution {
public boolean isHappy(int n) {
Set<Integer> happySet = new HashSet();
return judge(n, 0, happySet) == 1;
}
public int judge(int n, int happy, Set<Integer> happySet) {
while(n >= 10) {
int x = n % 10;
n = n / 10;
happy += x*x;
}
happy += n*n; //这个happy是经过平方和后的新数
if(!happySet.add(happy)) {
return happy;
}
return happy == 1 ? happy : judge(happy, 0, happySet);
}
}
3.快慢指针
public boolean isHappy2(int n){
int slow = n, fast = create(n);
while(fast != 1){
if(fast == slow) return false; // 快指针等于慢指针,这个说明在计算过程中循环了,数字之间构成了环。
fast = create(create(fast));
slow = create(slow);
}
return true;
}
private int create(int n) {
int sum = 0;
while (n != 0){
sum += n % 10 * (n % 10);
n /= 10;
}
return sum;
}
python
class Solution:
def isHappy(self, n: int) -> bool:
happy_set = set()
flag = self.judge(n, 0, happy_set)
return flag == 1
def judge(self, n: int, happy: int, happy_set: set) -> int:
while(n >= 10):
x = n % 10
happy += x*x
n = n // 10
happy += n*n #这个happy是经过平方和后新的新数
if(not(happy in happy_set)):
happy_set.add(happy)
else:
return happy
return happy if happy == 1 else self.judge(happy, 0, happy_set)
4.关键点
HashSet(Collection<? extends E> c) 构造一个包含指定集合中的元素的新集合。
HashSet(int initialCapacity) 构造一个新的空集合;
背景HashMap实例具有指定的初始容量和默认负载因子(0.75)。
HashSet(int initialCapacity, float loadFactor) 构造一个新的空集合; 背景HashMap实例具有指定的初始容量和指定的负载因子。