( LeetCode 面试经典 150 题 ) 202. 快乐数 (快慢指针)
题目:202. 快乐数
思路:快慢指针来找出循环点。快指针fast每次走两步,慢指针last每次走一步,当两者相遇时,也就是来到了循环点。判断这个点是否为1即可。
如果是一个快乐数,那么fast一定先来到1,并且一直是1,等着last,没有循环。
如果不是一个快乐数,那就会是一个循环,fast和last终将会相遇。
C++版本:
class Solution {
public:int solve(int num){int sum=0;while(num){int x=num%10;num/=10;sum+=x*x;}return sum;}bool isHappy(int n) {int last=n,fast=n;do{last=solve(last);fast=solve(fast);fast=solve(fast);}while(last!=fast);return last==1;}
};
JAVA版本:
class Solution {int solve(int num){int sum=0;while(num!=0){int x=num%10;num/=10;sum+=x*x;}return sum;}public boolean isHappy(int n) {int last=n,fast=n;do{last=solve(last);fast=solve(fast);fast=solve(fast);}while(last!=fast);return last==1;}
}
GO版本:
func isHappy(n int) bool {last,fast:=n,nfor 1==1 {last=solve(last)fast=solve(fast)fast=solve(fast)if last==fast {break}}return last==1
}
func solve(num int) int{sum:=0for num!=0 {x:=num%10sum+=x*xnum/=10}return sum
}