一:解题思路
这个题的本质和之前做过的单链表是否有环差不多。
方法一:利用一个集合set不断的变化数字,并将数字加入到集合set中,如果发现变换的数字最终为1则返回true,如果发现集合中以及存在之前变换的数字,则返回false。Time:O(1),Space:O(1)
方法二:快慢指针法,快指针每次走2步,慢指针每次走1步。当如果发现快指针等于1,或者快指针追上慢指针的时候就返回true。
二:完整代码示例 (C++版和Java版)
方法一C++:
class Solution { public: int transform(int n) { int sum = 0; while (n != 0) { int a = n % 10; sum += a * a; n /= 10; } return sum; } bool isHappy(int n) { if (n <= 0) return false; set<int> s; for (int i = n; i != 1; i=transform(i)) { if (s.count(i) != 0) return false; s.insert(i); } return true; } };
方法一Java:
class Solution { private int transform(int n) { int sum=0; while(n!=0) { int a=n%10; sum+=a*a; n/=10; } return sum; } public boolean isHappy(int n) { if(n<=0) return false; Set<Integer> s=new HashSet<>(); for(int i=n;i!=1;i=transform(i)) { if(s.contains(i)) return false; s.add(i); } return true; } }
方法二C++:
class Solution { public: int transform(int n) { int sum = 0; while (n != 0) { int a = n % 10; sum += a * a; n /= 10; } return sum; } bool isHappy(int n) { if (n <= 0) return false; int fast = n, slow = n; while (true) { fast = transform(transform(fast)); slow = transform(slow); if (fast == 1) return true; if (fast == slow) return false; } } };
方法二Java:
class Solution { private int transform(int n) { int sum=0; while(n!=0) { int a=n%10; sum+=a*a; n/=10; } return sum; } public boolean isHappy(int n) { if(n<=0) return false; int fast=n,slow=n; while(true) { fast=transform(transform(fast)); slow=transform(slow); if(fast==1) return true; if(fast==slow) return false; } } }