https://leetcode-cn.com/problems/happy-number/
关于是否重复循环的问题,可以用:
- 一快一慢指针来判断是否有循环
- 用哈希表存储值,判断是否有重复
但第二种方法有缺陷,如果循环过大时,需要超大的内存。
解题思路:
方法:
使用 “快慢指针” 思想,找出循环:“快指针” 每次走两步,“慢指针” 每次走一步,当二者相等时,即为一个循环周期。此时,判断是不是因为 1 引起的循环,是的话就是快乐数,否则不是快乐数。
注意:此题不建议用集合记录每次的计算结果来判断是否进入循环,因为这个集合可能大到无法存储;另外,也不建议使用递归,同理,如果递归层次较深,会直接导致调用栈崩溃。不要因为这个题目给出的整数是 int 型而投机取巧。我思故我在
2020-08-13
这个问题用哈希表没有问题。集合不会很大。对于一个数n,它有log10(n)位,所以顶多log10(n)次就会跌落到三位数的范围内,三位数范围循环也顶多占用999个整数空间。log10(n)+999不会很大的。
题解出处:
https://leetcode-cn.com/problems/happy-number/solution/shi-yong-kuai-man-zhi-zhen-si-xiang-zhao-chu-xun-h/
class Solution {
public boolean isHappy(int n) {
Set repeatNumber = new HashSet<Integer>();
int number = 0;
while(true){
//计算平方和
while(n != 0){
System.out.println("No1.: "+number);
number += Math.pow(n % 10, 2);//保留最小一位
n = (int)n / 10;
System.out.println("number: "+number);
System.out.println("n: "+n);
}
//判断是否等于1
if(number == 1) return true;
//判断是否循环,循环了就不happy,这是数是否在set里,不在就加进去
if(repeatNumber.contains(number)){
return false;
}
repeatNumber.add(number);
n = number;//更换n的值进入下一次循环
number = 0;
}
}
}