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; } }
时间: 2024-10-12 17:09:30