Q202 Happy Number
Write an algorithm to determine if a number is "happy".
A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers.
Example: 19 is a happy number
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
解题思路:
根据题意,最后结果为 1 是 happy number,返回 True,否则必定出现环,不是 happy number 返回 False。
在写代码的时候,happy number 的终止条件容易得到(循环过程中平方和等于1即可)。但是,不是 happy number 的终止条件不容易找到。
但是,发现一个规律:如果出现环,则这个环中必定出现 4 这个数字。比如5,循环结果依次是:
25,29,85,89,145,42,20,4,16,37,58,89,145,42,20,4......
其他不是 happy number 的也有这样的规律。因此,循环终止的条件就可以找到了。
Python实现:
class Solution(object):
def isHappy(self, n):
"""
:type n: int
:rtype: bool
"""
while True:
n = sum([int(ch)**2 for ch in str(n)])
if n == 1: return True
if n == 4: return False
a = 19
b = 8
c = Solution()
print(c.isHappy(a)) # True
print(c.isHappy(b)) # False
补充:
如果观察不到这个规律,我可能使用快慢指针解决是否有环的问题。慢指针 slow 每次只计算一次平方和,快指针 fast 每次计算两次平方和。如果快指针追上慢指针(fast = slow),且慢指针不为1,则代表有环,不是 happy number,否则为 happy number。
快慢指针的思路来源于判断链表是否有环的问题:Q141 Linked List Cycle。
关于快慢指针:
快慢指针可以解决这样的问题:
- 判断链表是否有环(设置两个指针,慢指针每次走一步,快指针每次走两步,如果有环,两指针总会相遇);
- 求链表中点(设置两个指针,慢指针每次走一步,快指针每次走两步,当快指针走到链表尾,慢指针刚好到链表中点);
- 求链表倒数第n个数(设置两个指针,快指针先走n步,然后慢指针和快指针一起走,当快指针到达链表尾,慢指针刚好为倒数第n个数);
- 如果链表有环,求环的入口(设置两个指针,一个指针指向相遇点,一个指针指向链表头。每次各走一步,再次相遇的点就是环入口)。
- (58) 文本文件和字符流 / 计算机程序的思维逻辑
- Python爬虫—破解JS加密的Cookie
- Python通过抓包和使用cookie爬取微博完全讲解
- (50) 剖析EnumMap / 计算机程序的思维逻辑
- 认识九大经典sql模式
- 构建一个pip安装的车辆路径显示的Python包
- 如何编写复杂sql
- Python机器学习工具:Scikit-Learn介绍与实践
- (51) 剖析EnumSet / 计算机程序的思维逻辑
- mysql性能优化的几条重要建议
- Python爬虫抓取知乎所有用户信息
- Eclipse远程调试出现“JDWP Transport dt_socket failed to initialize”的解决方案
- Django 博客教程:前言和环境安装(连载一)
- (52) 抽象容器类 / 计算机程序的思维逻辑
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PostgreSQL异常宕机重启时间超长
- C++ 重载运算符 继承 多态 (超详细)
- USACO 2.1 海明码 Hamming Codes (模拟+位运算+黑科技__builtin_popcount(n))
- POJ 3267为什么优先队列超时,DP就能过,难过
- 执行ALTER TABLE语句时如何避免长时间阻塞并发查询
- P1458 顺序的分数 Ordered Fractions(有技巧的枚举)+C++类封装=精简代码
- Codeforce 140C (贪心+优先队列)补题
- CodeForces - 140A New Year Table (几何题)当时没想出来-----补题
- PostgreSQL vacuum可见性
- PostgreSQL VFD机制
- POJ 2136 Vertical Histogram(当时写的比较恶心,优化一下)
- PostgreSQL 12的可拔插存储引擎--表访问方法以及bloackholes案例
- POJ 2230 Watchcow 欧拉回路的DFS解法(模板题)
- POJ 2188 Cow Laundry
- 51NOD 2072 装箱问题 背包问题 01 背包 DP 动态规划