非商业,不侵权,LeetCode链接附上:
https://leetcode-cn.com/problems/happy-number/
进入正题。
题目:
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
示例:
输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
代码实现:
/** * 获取当前数的平方和,即下一个数 */ private static int getNext(int n) { int temp = 0; while (n > 0) { temp += Math.pow(n % 10, 2); n = n / 10; } return temp; } /** * 两种情况 * 1.n是一个快乐数,此时没有循环,快跑者比慢跑着先到达数字1 * 2.n不是一个快乐数,最终快跑者和慢跑者将在同一个数字上相遇 * @param n * @return */ private static boolean isHappy(int n) { int slow = n; int fast = getNext(n); while (fast != 1 && slow != fast) { slow = getNext(slow); fast = getNext(getNext(fast)); } return fast == 1; } //时间复杂度O(logN), 空间复杂度O(1)
分析:
定义一个单独方法,根据规则,用来确定当前数的下一个数;
快慢指针用于快速的判断是否为快乐数,或非快乐数时,在循环的某个数字上相遇。
原文:https://www.cnblogs.com/heibingtai/p/13993202.html