如何给网站做右侧悬浮电话,山西省住房和城乡建设厅官方网站,通州 网站建设,个人工作室装修风格编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为#xff1a;
对于一个正整数#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1#xff0c…编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为
对于一个正整数每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true 不是则返回 false 。 示例 1
输入n 19
输出true
解释
12 92 82
82 22 68
62 82 100
12 02 02 1示例 2
输入n 2
输出false
class Solution {
public:int bitSquareSum(int n) {int sum 0;while(n 0){int bit n % 10;sum bit * bit;n n / 10;}return sum;}bool isHappy(int n) {int slow n, fast n;do{slow bitSquareSum(slow);fast bitSquareSum(fast);fast bitSquareSum(fast);}while(slow ! fast);return slow 1;}
};
使用 “快慢指针” 思想找出循环“快指针” 每次走两步“慢指针” 每次走一步当二者相等时即为一个循环周期。此时判断是不是因为 1 引起的循环是的话就是快乐数否则不是快乐数。 注意此题不建议用集合记录每次的计算结果来判断是否进入循环因为这个集合可能大到无法存储另外也不建议使用递归同理如果递归层次较深会直接导致调用栈崩溃。不要因为这个题目给出的整数是 int 型而投机取巧。
但是实际上可以用循环去求解因为迭代次数不会超过9*9*10次这道题我看到题解学到了快慢指针思想非常优雅的代码。浅谈快慢指针-CSDN博客