我是一个从汽车行业转行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. Facebook的首席技术官:人工智能已用于内容审核,未来会做更多
  3. windows Server 2003   IIS启用父路径
  4. 分水岭算法分割图像的原理概述及OpenCV代码实现
  5. DFT实训教程笔记1(bibili版本)- introduction to DFT DFT Architecture
  6. 一网打尽,最全面的跨域解决方案来了!
  7. 从运维角度浅谈MySQL数据库优化
  8. ORACLE START WITH 语句的树级结构例子
  9. vux 使用 font-awesome
  10. linux 安装rpm包时遇到error:Failed dependencies解法方法
  11. Bug--时区问题导致IDEA连接数据库失败
  12. 格式工厂 wav 比特率_智能音乐格式转换
  13. cad插件加载bplot成功用不了_Batchplot批量打印命令无效,对照情况进行解决
  14. 互联网数据响应时间计算公式
  15. iOS开发iPhone竖屏icon尺寸与启动页尺寸汇总
  16. 数据赋能:Uber的数据治理实践分享
  17. Java创建对象的四种方法
  18. 读aroundall的回复有感
  19. 坦克大战java(章程)
  20. 软件产品案例分析——福州大学微信小程序

热门文章

  1. java junit 怎么写_java-如何确定代码是否在JUnit测试内运行?
  2. R语言实现决策回归树的包rpart
  3. Error:Android Source Generator: [sdk] Android SDK is not specified.
  4. 声卡常见故障解决方法
  5. 【Day63】PHP支付宝服务窗API接口的开发
  6. JAVA—— Redis基础
  7. 智能在线整体防雷系统解决方案
  8. 【安全知识分享】厨房安全知识培训(42页).pptx(附下载))
  9. 在项目中学习.NET的json(二)之运费计算器
  10. Unity Shader 视差映射