虽然是一道简单题,但是简单的基础是对这个数学问题有足够的认识,最重要的就是要知道,不论多大的数,最终都会回到243以下,因为最大的三位数99经过一次操作后便是243,而更大的数操作后数位会不断减少,最后回到243以下。知道这一点是比较关键的,因为可以把所有数分为两类,一类是可以到达1的,一类是处于死循环中的,所以说,是否存在死循环就是判断是否是快乐树的标准之一。在链表之中查找是否有死循环可以通过快慢指针的方法去做,该题目也一样。当然设定一个哈希表,把所有遇到的数存入表中,若在计算中出现重复的数,则代表出现循环,则结束,这样的方法也是可以的,本质上是类似的。贴代码
1 class Solution { 2 public: 3 int NextNode(int n) 4 { 5 int num = 0; 6 while(n>0) 7 { 8 int d = n%10; 9 n = n/10; 10 num += d*d; 11 } 12 return num; 13 } 14 bool isHappy(int n) 15 { 16 int fn = NextNode(n); 17 int sn = n; 18 while(fn != 1 && fn!=sn) 19 { 20 fn = NextNode(NextNode(fn)); 21 sn = NextNode(sn); 22 } 23 return fn == 1; 24 } 25 };