LeetCode202. 快乐数
题目
编写一个算法来判断一个数 n 是不是快乐数。
快乐数定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,
也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 True ;不是,则返回 False 。

分析
本题开始一头雾水,因为可能无限循环。这题关键就在此。思考怎样会出现出现无限循环?也就是什么情况下会判定为非快乐数?
如果当前计算得到的各位平方和之前出现过,意味着就出现了循环,以后还是循环。。。这就相当于找一个数之前是否出现过。
这很明显就是用哈希中的set集合,因为集合不同的元素具有唯一性,用find查找集合即可。
代码
1 class Solution {
2 public:
3 //取每位上的数的平方之和
4 int sum(int n){
5 int s = 0;
6 //如何取每位上的数?对10取余再除以10
7 while(n){
8 s += (n%10) * (n%10);
9 n /= 10;
10 }
11 return s;
12 }
13 bool isHappy(int n) {
14 unordered_set<int>st;
15 while(1){
16 int res = sum(n);
17 if(res == 1) return true;
18 auto it = st.find(res);
19 if(it != st.end()) return false;
20 st.insert(res);
21 n = res;
22 }
23 }
24 };
法二、快慢指针判断循环,其实就是弗洛伊德判圈算法(龟兔赛跑)
想象一下,假设有两个小孩子在一个“可以无限向前跑”的跑道上赛跑,同时出发,但其中一个小孩的速度是另一个的两倍。如果跑道是直的,跑的快的永远在前面;但是如果跑道有环的话,则跑的快的小孩子将追上跑的慢的小孩。就是套圈了!
快指针每次比慢指针多走一步,所以快指针的路程的慢指针的2倍,当慢指针走完一圈,快指针正好走完两圈,两指针重合。
class Solution {
public:
//取每位上的数的平方之和
int sum(int n){
int s = 0;
//如何取每位上的数?对10取余再除以10
while(n){
s += (n%10) * (n%10);
n /= 10;
}
return s;
}
bool isHappy(int n) {
int slow = sum(n);
int fast = sum(sum(n));
while(fast != slow ){
slow = sum(slow);
fast = sum(sum(fast));
}
return slow == 1;
}
};
注意非快乐数出现的死循环就是有环,判断有环用快慢指针,相遇说i明有环,最后看下相遇点是否是1
本题和链表中的判断是否有环一样
LeetCode202. 快乐数的更多相关文章
- [Swift]LeetCode202. 快乐数 | Happy Number
Write an algorithm to determine if a number is "happy". A happy number is a number defined ...
- [LeetCode] Happy Number 快乐数
Write an algorithm to determine if a number is "happy". A happy number is a number defined ...
- lintcode-【简单题】快乐数
题目: 写一个算法来判断一个数是不是"快乐数". 一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为他每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,或是 ...
- lintcode:快乐数
快乐数 写一个算法来判断一个数是不是"快乐数". 一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为他每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,或是 ...
- leetcode python快乐数
编写一个算法来判断一个数是不是“快乐数” “快乐数”的定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复该过程直到为1,也可能是无限循环但始终变不到1. 如果可以变为1,那 ...
- C#版(打败97.89%的提交) - Leetcode 202. 快乐数 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- Leetcode 202.快乐数 By Python
编写一个算法来判断一个数是不是"快乐数". 一个"快乐数"定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 ...
- 力扣(LeetCode)202. 快乐数
编写一个算法来判断一个数是不是"快乐数". 一个"快乐数"定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 ...
- 【leetcode 简单】 第五十六题 快乐数
编写一个算法来判断一个数是不是“快乐数”. 一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1.如 ...
随机推荐
- JavaSE08-ArrayList
1.ArrayList类概述 什么是集合 提供一种存储空间可变的存储模型,存储的数据容量可以发生改变 ArrayList集合的特点 底层是数组实现的,长度可以变化 泛型的使用 用于约束集合中存储元素的 ...
- 2020-2021-1 20209307 《Linux内核原理与分析》第十一周作业
这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第十一周作业> 这个作业的目标 ...
- 网站配置Gittalk教程和解决gittalk的Error: Not Found.问题
想把网站增加gittalk的评论功能,按照其他教程配置后,出现了 Error: Not Found. 的错误.截图如下: 网上找了很多解决方案,现在贴出来完整的配置Gittalk的教程. 01.新建评 ...
- CentOS 7 mini版本安装后必须要做的几件事
Linux家族非常的庞大,诸如Debian.Ubuntu.RedHat.CentOS.ArchLinux.Gentoo,甚至还有国内比较有名的Deepin,都是Linux家族闪耀的明星.根据实际需求涉 ...
- css进阶 03-网页设计和开发中,关于字体的常识
03-网页设计和开发中,关于字体的常识 #前言 我周围的码农当中,有很多是技术大神,却常常被字体这种简单的东西所困扰. 这篇文章,我们来讲一讲关于字体的常识.这些常识所涉及到的问题,有很强的可操作性, ...
- spring的基础面试内容
1.什么是spring? Spring 是个Java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring 框架目标是简化Java ...
- Go加密算法总结
前言 加密解密在实际开发中应用比较广泛,常用加解密分为:"对称式"."非对称式"和"数字签名". 对称式:对称加密(也叫私钥加密)指加密和解 ...
- [.NET] WCFDataService项目host到IIS上碰到的一个问题:数据库未能打开
今天在尝试重现OP一个问题的,遇到了一个新的问题. 项目坏境: WCF Data Service 5.6 Entity Framewrok 5(不用6的原因时要重新配置WCF项目) SQL Serve ...
- C++STL教程
1 什么是STL? STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库.它被容纳于C++标准程序库(C++ Standard Libr ...
- 建议收藏!利用Spring解决循环依赖,深入源码给你讲明白!
前置知识 只有单例模式下的bean会通过三级缓存提前暴露来解决循环依赖的问题.而非单例的bean每次获取都会重新创建,并不会放入三级缓存,所以多实例的bean循环依赖问题不能解决. 首先需要明白处于各 ...