我是一个从汽车行业转行IT的项目经理,我是Edward,如想了解更多,请关注我的公众号【转行项目经理的逆袭之路】。今天是五一长假前的最后一天,其实想想,对于有稳定工作的人来说,今年也真是爽,上半年假就像休不完一样,连leetcode的每日一题在今天都抛出了快乐数这个题,让我们一起来看看吧。

202. 快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

分析

将题目分为两个问题,1.各位数平方之和的算法 2.无限循环如何处理

第一个问题很简单,第二个问题就有点棘手了,好在我们可以查百度:

不是快乐数的数称为不快乐数(unhappy number),所有不快乐数的数位平方和计算,最後都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环中。

用一句话形容就是:每个快乐数都有相同的happy ending,而每个不快乐数都在不快乐中无限循环

思路

既然知道了不快乐数的各位数平方和会形成一个环,那么我们就可以用快慢指针来解决,慢的走一步,快的走两步,循环一次就相遇,慢指针遍历了所有结点,如果相遇时慢指针不为1则不是快乐数(注意:如果在中间出现1,后面的所有平方和均会是1)。
关于快慢指针,是解决链表问题的经典方法,具体可以参看这篇文章:
https://www.cxyxiaowu.com/7913.html

实现

package algorithm;
/*** 202. Happy Number* Input: 19
Output: true
Explanation:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
* @author EP
* @date 2020年4月30日
* @version 1.0*/public class Solution_isHappy {public static void main(String[] args) {int n = 19;System.out.println(isHappy(n));}public static boolean isHappy(int n) {//快慢指针,相遇即为一次循环,为1则永远为1int slow = n; int fast =squareSum(n);while (slow!=fast) {//fast每次都快走一步slow = squareSum(slow);fast=squareSum(squareSum(fast));}return slow==1;}public static int squareSum(int n) {int sum=0;while (n>0) {int digit = n%10;sum+=digit*digit;n/=10;}return sum;}}

好了,告诉我,今天你快乐了吗?

Are you happy today?快乐数相关推荐

  1. LeetCode实战:快乐数

    题目英文 Write an algorithm to determine if a number is "happy". A happy number is a number de ...

  2. 快乐数(最终要变成1)

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

  3. 算法----------快乐数 (Java版本)

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

  4. LeetCode 快乐数(Happy Number)

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

  5. 快乐数(双指针,哈希表)

    快乐数 方法一:用哈希表来记录 方法二.双指针 题目:编写一个算法来判断一个数 n 是不是快乐数. 「快乐数」定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和. 然后重复这个过程 ...

  6. LeetCode Algorithm 202. 快乐数

    202. 快乐数 Ideas 快乐数的判断逻辑其实挺简单的,按照定义去循环执行就可以了. 关键是如果不是快乐数怎么结束循环. 我们猜测会有以下三种可能: 最终会得到 1 最终会进入循环 值会越来越大, ...

  7. lintcode-【简单题】快乐数

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

  8. leetcode 202. 快乐数 思考分析(哈希集合与双指针解)

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

  9. [Leedcode][JAVA][第202题][快乐数]

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

  10. LeetCode 202. 快乐数(快慢指针)

    1. 题目 2. 解题 一个数经过若干次各位数平方和后,会等于它自己 使用类似环形链表的快慢指针法,最终快慢指针相遇,若不为1则是不快乐数 class Solution {public:int bit ...

最新文章

  1. 张家界举行“火王”争霸赛 众人街头“玩火”
  2. Wide ResNet ResNeXt DenseNet DPNet [9] NASNet [10] SENet [11] Capsules [12
  3. MAC OS中的dylib 的@rpath和@loader_path小问题
  4. 给列名称命名_批量提取文件名,然后换上新名称
  5. Bootstrap全局css样式_表单
  6. Java中的生成器设计模式
  7. C语言 二分法查找数组元素
  8. ubuntu 15.04安装VMware11
  9. Unity3d札记 --TanksTutorial收获与总结
  10. 嘉兴市人才网即时招聘栏目Ajax动态翻页爬虫练习
  11. 关于笔记本电脑网卡出问题的简单解决
  12. Excel表格转latex以及转换后的表格边框截断解决、加粗和内容水平垂直居中
  13. 浅析地理数据模型发展
  14. python高德地图可视化_【可视化】python地图可视化_Folium
  15. 手把手带你抓取智联招聘的“数据分析师”岗位!
  16. Go 调用 Java 方案和性能优化分享
  17. PotPlayer播放DST音频的mkv电影解码错误
  18. 英特尔挖走苹果M1芯片工程师,或将改变x86架构
  19. 详细了解java中的null_深入理解java中的null“类型”
  20. 白话空间统计二十七:统计学七支柱之空间统计版本(二)聚合(2)

热门文章

  1. 2021-07-23体素模型展示
  2. Ubuntu安装MySQL 8.0 - APT(结尾附视频)
  3. oeasy教您玩转vim - 78 - # 操作系统文件格式 fileformat
  4. ABP .NET Core 菜单配置与授权
  5. mcafee的mysql audit认证插件的使用
  6. Minecraft我的世界 forge mdk1.13(1.14)开发环境搭建教程及经验
  7. Qt/PyQt 重写mouseMoveEvent事件 实时监测鼠标移动
  8. 设置里首选网络类型由3G改成4G
  9. android 5.1 6.0网络首选项默认为LTE only
  10. 在VS中怎么用vb画矩形_PS神操作之这个凹陷怎么做?