题目
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:
Input: 19
Output: true
Explanation:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
分析
- 这种数据生成方式和链表结构相似,可以用处理链表的方式来处理这道题目
- 如果数据不以1结尾,则一定会成环。所有可以用判断链表是否有环的方式来做这道题。如果有环,不是happy number,如果没有环,是happy number.
代码和注释
int get_next(int n) {
int ans = 0;
while(n) {
ans += (n % 10) * (n % 10);
n /= 10;
}
return ans;
}
bool isHappy(int n) {
int p;
int q;
p = q = n;
do {
p = get_next(p); //从当前节点开始走一步,相当于慢指针
q = get_next(get_next(q)); // 从当前节点开始走两步,相当于快指针
}while(p != q); //如果成环,一定可以相遇,p == q ; 如果没有环,最后都能走到末尾
if (p != 1) return false; //如果没有环,到最后一定是1
return true;
}