202快乐数
题目:
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
实例:
示例 1:
输入:n = 19
输出:true
示例 2:
输入:n = 2
输出:false
思路:
找出重复的数字避免进入循环。(但是我做的时候不知道一个概念,不管是不是欢乐数,拆分平方和的过程都会陷入循环,一种是欢乐数的循环(都是1),一种是不是欢乐数的循环(但是重复的几个数是已知的,力扣第三个方法用的就是这个原理),所以我们要做的就是找到进入1的循环并及时终止。)
一、哈希表
二、快慢指针
用快和慢两个数模拟快慢指针,每次快的数转换两次,慢指针转换一次;
快指针会追上慢指针,只需要判断当他们相等的时候数值是否等于1即可;
如果=1,是欢乐数,否则不是。
三、数学法(循环的数已知)
题解:
class Solution {public:int nums(int n){int sum=0;while(n){int k=n%10;n=n/10;sum+=k*k;}return sum;}bool isHappy(int n) {int slow=n,fast=nums(n);do{slow=nums(slow);fast=nums(nums(fast));}while(slow!=fast);return (slow==1);}};
