Leetcode 202 Happy Number 弗洛伊德判环解循环

今天先谈下弗洛伊德判环,弗洛伊德判环原来是在一个圈内有两人跑步,同时起跑,一人的速度是另一人的两倍,则那个人能在下一圈追上另一个人,弗洛伊德判环能解数字会循环出现的题,比如说判断一个链表是不是循环链表。在程序中具体表现为

one = change(one); //一倍速度
two = change(change(two));//两倍速度

即一倍速度的人调用生成函数change一次,两倍速度的人调用生成函数change两次。

Leetcode 202 Happy Number 就是这样一道简单的题,实现方法有很多,但是弗洛伊德判环是比较简单,同时效率也是较高的那种。

class Solution {
public:
	int change(int n){
		int ans  = 0;
		for ( ; n!=0 ; ans+= (n%10)*(n%10),n/=10);
		return ans;
	}
	bool isHappy(int n) {
		int one = n;
		int two = n;
		while(1){
			one = change(one); //一倍速度
			two = change(change(two));//两倍速度
			if(one == 1 || two == 1) return true;
			if(one == two) return false;
		}
		
	}
};

 

posted @ 2016-01-12 16:47  Breeze0806  阅读(637)  评论(0编辑  收藏  举报