题目:

编写一个算法来判断一个数 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 <= 231 - 1

来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

快慢指针:创建一个慢指针,每次走一步,再创建一个快指针,每次走两步,当快慢指针相遇时,代表形成了环路,这个数字就不是快乐数【有环的话一定会相遇的原因:快指针每走一步,在他们移动方向上,快指针就会向慢指针靠近一个结点】,如果指针移动过程中,找到了1,则当前是一个快乐数。

举例:n = 116,运用官方图解

1.初始值slow = 116, fast = SquareSum(116)=38;

2.fast != 1 && slow != fast,继续向前,slow= SquareSum(116)=38,fast=SquareSum(SquareSum(38))=58;

3.fast != 1 && slow != fast,继续向前,slow= SquareSum(38)=73,fast=SquareSum(SquareSum(58))=145;

4.fast != 1 && slow != fast,继续向前,slow= SquareSum(73)=58,fast=SquareSum(SquareSum(145))=20;

5.fast != 1 && slow != fast,继续向前,slow= SquareSum(58)=89,fast=SquareSum(SquareSum(20))=16;

6.fast != 1 && slow != fast,继续向前,slow= SquareSum(89)=145,fast=SquareSum(SquareSum(16))=58,这时又遇到58,又会继续循环;

7.开始和上一个58一样的循环,fast != 1 && slow != fast,继续向前,slow= SquareSum(145)=42,fast=SquareSum(SquareSum(58))=145;

8.fast != 1 && slow != fast,继续向前,slow= SquareSum(42)=20,fast=SquareSum(SquareSum(145))=20,这时快慢指针相遇,形成环路,说明116并不是一个快乐数,不会再遇到1;

 java代码:

 1 class Solution {
2 public int SquareSum(int n){
3 int sum = 0;
4 while(n > 0){
5 int d = n % 10;
6 sum += d * d;
7 n /= 10;
8 }
9 return sum;
10 }
11
12 public boolean isHappy(int n) {
13 int slow = n, fast = SquareSum(n);
14 while(fast != 1 && slow != fast){
15 slow = SquareSum(slow);
16 fast = SquareSum(SquareSum(fast));
17 }
18 return fast == 1;
19 }
20 }

 python3代码:

 1 class Solution:
2 def isHappy(self, n: int) -> bool:
3 def SquareSum(n):
4 sum = 0
5 while n > 0:
6 d = n % 10
7 sum += d * d
8 n //= 10
9 return sum
10
11 slow = n
12 fast = SquareSum(n)
13 while fast != 1 and slow != fast:
14 slow = SquareSum(slow)
15 fast = SquareSum(SquareSum(fast))
16 return fast == 1

2023-05-09:

哈希表:

 1 class Solution {
2 public boolean isHappy(int n) {
3 HashSet<Integer> set = new HashSet<>();
4 while (n != 1 && !set.contains(n)){
5 set.add(n);
6 n = getnext(n);
7 }
8 return n == 1;
9 }
10 public int getnext(int n){
11 int res = 0;
12 while (n != 0){
13 int temp = n % 10;
14 res += temp * temp;
15 n /= 10;
16 }
17 return res;
18 }
19 }

力扣202(java&python)-快乐数(简单)的更多相关文章

  1. 力扣 —— Two Sum ( 两数之和) python实现

    题目描述: 中文: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利 ...

  2. [LeetCode] 202. Happy Number 快乐数

    Write an algorithm to determine if a number is "happy". A happy number is a number defined ...

  3. 202 Happy Number 快乐数

    写一个算法来判断一个数是不是“快乐数”.一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,或是无限循环但始终变不到 1.如 ...

  4. leetcode python快乐数

    编写一个算法来判断一个数是不是“快乐数” “快乐数”的定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复该过程直到为1,也可能是无限循环但始终变不到1. 如果可以变为1,那 ...

  5. 力扣题目汇总(丑数,重复N的元素,求众数)

    丑数 1.题目描述 编写一个程序判断给定的数是否为丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例 1: 输入: 6 输出: true 解释: 6 = 2 × 3 示例 2: 输入: 8 ...

  6. 力扣(LeetCode)平方数之和 个人题解

    给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c. 示例1: 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5 示例2: 输入: 3 ...

  7. 力扣(LeetCode)两数相加 个人题解

    给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  8. 力扣(LeetCode)202. 快乐数

    编写一个算法来判断一个数是不是"快乐数". 一个"快乐数"定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 ...

  9. 力扣Leetcode 202. 快乐数 -快慢指针 快乐就完事了

    快乐数 编写一个算法来判断一个数 n 是不是快乐数. 「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不 ...

  10. Java实现 LeetCode 202 快乐数

    202. 快乐数 编写一个算法来判断一个数是不是"快乐数". 一个"快乐数"定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过 ...

随机推荐

  1. python下进行10进制转16进制不带0x并且将16进制转成小端序

    前记   python涉及到和硬件互交的部分,一般是需要发送十六进制的帧长的.所以,python这个转换还是经常使用的.笔者在这里遇到了一个问题.就做一个记录吧. 基本方法:  假如你熟悉python ...

  2. Java/Kotlin 密码复杂规则校验

    原文地址: Java/Kotlin 密码复杂度校验 | Stars-One的杂货小窝 每次有那个密码复杂校验,不会写正则表达式,每次都去搜,但有时候校验的条件又是奇奇怪怪的,百度都搜不到 找到了个代码 ...

  3. [LeetCode] 5933. k 镜像数字的和

    一.摘要 本文介绍了一种通过模拟寻找十进制镜像数字,然后判断其对应的k进制表示是否也是镜像的方法.具体来讲即从小到大遍历10进制的镜像数字,然后对10进制镜像数字转为k进制,然后判断转为k进制后是否还 ...

  4. 游戏引擎中的实时渲染和在V-Ray中渲染有什么区别 2022-11-25

    游戏引擎中的实时渲染和在V-Ray中渲染有什么区别,下面我们一起来分析一下,从2个方面来具体分析实时渲染和在V-Ray中渲染种的不一样的区别. 原理区别 VRay等渲染器原理上叫做离线渲染(Offli ...

  5. 工作记录:8个有用的JS技巧

    这里给大家分享我最近学习到的8个有用的js小技巧,废话不多说,我们上代码 1. 确保数组值 使用 grid ,需要重新创建原始数据,并且每行的列长度可能不匹配, 为了确保不匹配行之间的长度相等,可以使 ...

  6. 记录--优雅解决uniapp微信小程序右上角胶囊菜单覆盖问题

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 大家好,今天聊一下在做uniapp多端适配项目,需要用到自定义导航时,如何解决状态栏塌陷及导航栏安全区域多端适配问题,下文只针对H5 ...

  7. 记录--前端实习生的这个 bug 被用做了一道基础面试题

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 测试发现了一个问题,简单描述问题就是通过函数删除一个数组中多个元素,传入的参数是一个数组索引. 然后发现实际效果有时删除的不是想要的 ...

  8. LocalDate获取指定月的上个月的第一天和最后一天

    LocalDate date = LocalDate.of(2022, 8, 30); LocalDate lastMonth = date.minusMonths(1); // 当前月份减1 Loc ...

  9. Oracle 获取月初、月末时间,获取上一月月初、月末时间

    select trunc(sysdate, 'mm'), last_day(trunc(sysdate)), trunc(add_months(trunc(sysdate), -1), 'mm'), ...

  10. 浅析JS原型链

    目录 实例对象 原型对象 对象原型 短暂总结一下 constructor 原型链 何为原型链呢? 就是实例对象和原型对象之间的链接,每一个对象都有原型,原型本身又是对象,原型又有原型,以此类推形成一个 ...