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
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 =
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)