c语言除了做网站还能干什么,网站注册页面代码,普拓网站建设,新浪重庆202. 快乐数
难度#xff1a;简单
题目
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为#xff1a;
对于一个正整数#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1#xff0c;也可能是 无限循环 但始终变…202. 快乐数
难度简单
题目
编写一个算法来判断一个数 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提示
1 n 23^1 - 1
个人题解
方法一模拟
一开始想先写出最简单的方式尝试打表找规律打表发现没规律0.0
思路
本题主要是要解决 无限循环 的问题用 hashSet 容器存储已经考虑过的数字便可得到当再次算回容器中数字便表示将会 无限循环返回 false 即可
class Solution {public boolean isHappy(int n) {HashSetInteger set new HashSet();set.add(n);while (n ! 1) {int sum 0;while (n 10) {sum (int) Math.pow(n % 10, 2);n / 10;}n sum n * n;if (set.contains(n)) {return false;}set.add(n);}return true;}
}复杂度分析
时间复杂度O(log n)空间复杂度O(log n)
官方题解
方法一用哈希集合检测循环
class Solution {private int getNext(int n) {int totalSum 0;while (n 0) {int d n % 10;n n / 10;totalSum d * d;}return totalSum;}public boolean isHappy(int n) {SetInteger seen new HashSet();while (n ! 1 !seen.contains(n)) {seen.add(n);n getNext(n);}return n 1;}
}复杂度分析
时间复杂度O(log n)空间复杂度O(log n)
方法二快慢指针法
通过反复调用 getNext(n) 得到的链是一个隐式的链表。隐式意味着我们没有实际的链表节点和指针但数据仍然形成链表结构。起始数字是链表的头 “节点”链中的所有其他数字都是节点。next 指针是通过调用 getNext(n) 函数获得。
意识到我们实际有个链表那么这个问题就可以转换为检测一个链表是否有环。因此我们在这里可以使用弗洛伊德循环查找算法。这个算法是两个奔跑选手一个跑的快一个跑得慢。在龟兔赛跑的寓言中跑的慢的称为 “乌龟”跑得快的称为 “兔子”。
不管乌龟和兔子在循环中从哪里开始它们最终都会相遇。这是因为兔子每走一步就向乌龟靠近一个节点在它们的移动方向上。
我们不是只跟踪链表中的一个值而是跟踪两个值称为快跑者和慢跑者。在算法的每一步中慢速在链表中前进 1 个节点快跑者前进 2 个节点对 getNext(n) 函数的嵌套调用。
如果 n 是一个快乐数即没有循环那么快跑者最终会比慢跑者先到达数字 1
如果 n 不是一个快乐数那么最终快跑者和慢跑者将在同一个数字上相遇。
class Solution {public int getNext(int n) {int totalSum 0;while (n 0) {int d n % 10;n n / 10;totalSum d * d;}return totalSum;}public boolean isHappy(int n) {int slowRunner n;int fastRunner getNext(n);while (fastRunner ! 1 slowRunner ! fastRunner) {slowRunner getNext(slowRunner);fastRunner getNext(getNext(fastRunner));}return fastRunner 1;}
}复杂度分析 时间复杂度O(log n)空间复杂度O(1)
作者力扣官方题解 链接https://leetcode.cn/problems/happy-number/solutions/224894/kuai-le-shu-by-leetcode-solution/ 来源力扣LeetCode 著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。