標籤:
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
思路:
這題目挺有意思的,肯定不能真的通過無限迴圈來判斷。我觀察了一下,估計不happy的數字,運算一圈後會出現前面已經出現過的數字,即在一組數字裡繞圈圈。故記錄一下出現過的數字,判斷是否重複。
如果重複了就不happy,得到1了就happy。
bool isHappy(int n) { unordered_set<int> record; while(1) { int sum = 0; while(n > 0) { sum += (n % 10) * (n % 10); n /= 10; } if(sum == 1) return true; if(record.find(sum) == record.end()) //當前數字沒有出現過 { record.insert(sum); n = sum; } else return false; } }
還有用O(1)空間的,就像鏈表找有沒有圈一樣,用快慢指標的思路。
public class Solution { public boolean isHappy(int n) { int x = n; int y = n; while(x>1){ x = cal(x) ; if(x==1) return true ; y = cal(cal(y)); if(y==1) return true ; if(x==y) return false; } return true ; } public int cal(int n){ int x = n; int s = 0; while(x>0){ s = s+(x%10)*(x%10); x = x/10; } return s ; }}
還有用數學的,所有不happy的數字,都會得到4.(??why)
bool isHappy(int n) { if (n <= 0) return false; int magic = 4; while (1) { if (n == 1) return true; if (n == magic) return false; int t = 0; while (n) { t += (n % 10) * (n % 10); n /= 10; } n = t; }}
【leetcode】Happy Number(easy)