# \#202 Happy Number
## *給定一正整數,當此數的每一位數平方和為1時,表示其為"Happy Number", return true(當<>1時,就持續用相同方式計算直到符合條件); 否則return false*
## Log
- build 20210424 by syhuang
## 快慢指針法(佛洛伊德演算法)
- 題目的計算方式, 其最後必會收斂為一數字group, 套用最短路徑算法(佛洛伊德演算法), 然後加上條件:節點數為1的時候就是Happy Number; 節點重複時且<>1表示進入loop, 不是Happy Number
- 此算法效率較佳
```javascript=
var isHappy = function(n) {
var slow = getSquareSum(n);
var fast = getSquareSum(slow);
while(fast!=1 && fast!=slow){
slow = getSquareSum(slow);
fast = getSquareSum(getSquareSum(fast));
}
return fast == 1;
function getSquareSum(num){
var result = 0;
num.toString().split('').forEach(function(val){
result+=val*val;
});
return result;
}
};
```
## 初見
- 用map紀錄每次計算的結果, 判斷是否出現過同樣的數字(表示loop, 此數不為Happy Number)
```javascript=
var isHappy = function(n) {
var map = new Map();
var isHappy=false,t=n;
while(!map.has(t) && !isHappy){
var ary = t.toString().split('');
var sum = 0;
ary.forEach(function(val){
sum+=val*val;
});
if(sum===1) isHappy=true;
map.set(t,sum);
t = sum;
}
return isHappy;
};
```
## 備註
- 此題解題的隱藏前題:任意正整數的每位數平方和, 其以相同方式持續不斷計算, 最後必定收斂到某一個數字group中循環; 而當這個group只有一個數字"1"時(1^2=1, 因此變成1循環), 就是此題要求的Happy Number(註1)
## 參考
- [註1](https://leetcode.com/problems/happy-number/discuss/56919/Explanation-of-why-those-posted-algorithms-are-mathematically-valid)
###### tags: `leetcode`, `leetcode-easy`