Write an algorithm to determine if a number is "happy".
A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers.
Example:
19 is a happy number
1
2
+ 9
2
= 82
8
2
+ 2
2
= 68
6
2
+ 8
2
= 100
1
2
+ 0
2
+ 0
2
= 1
首先想到的比较简单 就按照题目叙述来 用set防重
private HashSet<Integer> set = new HashSet<Integer>();
public boolean isHappy(int n) {
if(n == 1) return true;
int temp, result = 0;
while(n > 0){
temp = n%10;
result += temp * temp;
n = n/10;
}
if(set.contains(result)) return false;
set.add(result);
return isHappy(result);
}
空间复杂度O(n)
但是discuss里惊现神操作
I see the majority of those posts use hashset to record values. Actually, we can simply adapt the Floyd Cycle detection algorithm. I believe that many people have seen this in the Linked List Cycle detection problem. The following is my code:
int digitSquareSum(int n) {
int sum = 0, tmp;
while (n) {
tmp = n % 10;
sum += tmp * tmp;
n /= 10;
}
return sum;
}
bool isHappy(int n) {
int slow, fast;
slow = fast = n;
do {
slow = digitSquareSum(slow);
fast = digitSquareSum(fast);
fast = digitSquareSum(fast);
} while(slow != fast);
if (slow == 1) return 1;
else return 0;
}
想法非常像判断链表中是否有环
就想题目中叙述的 这种计算一定会陷入循环 如果循环时=1 那就是happy num 否则不是
空间复杂度O(1)