标签:10 p75 return int sum transform 202 leetcode 指针
一:解题思路
这个题的本质和之前做过的单链表是否有环差不多。
方法一:利用一个集合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; } } }
标签:10,p75,return,int,sum,transform,202,leetcode,指针 来源: https://www.cnblogs.com/repinkply/p/12627491.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。