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.

一个快乐数是这样定义的,规则如下:由一个整数开始,之后由整数每一位数字的平方和的总和代替这个数,然后重复这个过程,直到最后是1为止,或者这个循环是一个没有包含1的死循环。这些过程中最终结果是1的这些数被称为快乐数。

Example: 19 is a happy number

  • 12 + 92 = 82
  • 82 + 22 = 68
  • 62 + 82 = 100
  • 12 + 02 + 02 = 1

这个题目真的我没有想到好的思路,能想到的几点说一下,平方的值只有从0-9这几个数的平方,所以,定一个固定的数组一定比平方的计算要快,直接可以用数组下标取出最后的结果。

这道题难在如何判断它是一个死循环,而且还是没有1的。除了循环枚举我真的没有想到什么好的方法,我只能在想,肯定有几种特殊的情况是遇到一定是会出现死循环的。

网上给出的解答是这样的,具体是这样的

int digitSquareSum(int n) {int sum = 0, tmp;while (n) {tmp = n % 10;sum += tmp * tmp;n /= 10;}return sum;
}bool isHappy(int n) {int slow, fast;slow = fast = n;do {slow = digitSquareSum(slow);fast = digitSquareSum(fast);fast = digitSquareSum(fast);} while(slow != fast);if (slow == 1) return 1;else return 0;
}

这个算法我也是第一次见到,这我就好好研究了一番,发现这真的是一个神奇的算法。

名字叫做Floyd判圈算法(龟兔赛跑算法)

先往简单了说,就是判断有没有环,定两个起始位置一样的指针,一个跑的慢每次跑一个循环,一个跑的快每次跑相当于跑两个循环,一旦他们出现相同之后,那么就肯定是有环了,然后我们就看责怪环是不是1即可,这个算法最大的一个优点是时间复杂度低,空间复杂度也低,你不需要保存每一次出现的值然后和前面的值作比较。

具体算法的讲解我这边直接贴上地址,转载自:

http://blog.csdn.net/wall_f/article/details/8780209

说实话我很喜欢这个算法,确实棒极了!

leetcode202(Floyd判圈算法(龟兔赛跑算法))相关推荐

  1. Floyd判圈算法(Floyd's cycle detection

    Floyd判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm).该算法由美国科学家罗伯特·弗洛伊德发明 ...

  2. floyd 判圈算法 UVa 11549 计算器谜题

    题目http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. UVa 11549 Calculator Conundrum (训练指南,Floyd 判圈算法)

    算法竞赛训练指南, 42 页 注意: 1. 用数组来记录一个数的各位的数字 2. 快慢指针来记录链表环的入点(Floyd 判圈算法) #include <cstdio> #include ...

  4. 如何判断链表中是否存在环?Floyd判圈算法 leetcode刷题笔记 142. 环形链表 II

    这道题使用了floyd判圈算法,所以先讲解floyd算法的原理和实现,最后在附加上第142题的代码. floyd算法: 一.用途: 可以在有限状态机.迭代函数或者链表上判断是否存在环,求出该环的起点与 ...

  5. Calculator Conundrum UVA - 11549(floyd判圈)

    Calculator Conundrum UVA - 11549 题意: 给你一个n和k. 每次操作可以把k平方,之后取k*k的前n位 为 k. 思路: 首先可以想到,经过有限次操作后,会出现循环. ...

  6. UVa11549计算器谜题[floyd判圈]

    题意: 有个老式计算器,每次只能记住一个数字的前n位.现在输入一个整数k,然后反复平方,一直做下去,能得到的最大数是多少.例如,n=1,k=6,那么一次显示:6,3,9,1... 白书上的题 set, ...

  7. 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)

    算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...

  8. floyd判环算法(龟兔赛跑算法)

    floyd判环算法(龟兔赛跑算法) 注意,这个算法是用来判断一条链+一条环的图,环的长度或者环与链的交界处的,所以此floyd非彼floyd(虽然都是一个人想出来的). (图不是我的) 如果只要求环的 ...

  9. 弗洛伊德龟兔赛跑算法(弗洛伊德判圈算法)

    弗洛伊德( 罗伯特・弗洛伊德)判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm),是一个可以在有限状 ...

最新文章

  1. scikit-learn库中聚类算法自定义距离度量方式
  2. 通过全备+relaylog同步恢复被drop的库或表
  3. 13.7 线程生命周期状态图、线程常用的方法。
  4. 1.18.2.Table APISQL(概念与通用API、两种计划器(Planner)的主要区别、创建 TableEnvironment、临时表、永久表、创建表、虚拟表、Connector 等)
  5. Windows Server 2003 群集配置测试
  6. 小鹏汽车9月总交付10412台 成为新造车势力中第一家月交付过万的企业
  7. gridreport如何设置打印3次_pdfFactory如何设置限制打印和浏览文档权限
  8. 计算机考试属于相对性评价还是绝对性评价,【易错检测】查漏补缺第46天 — 相对性评价与绝对性评价...
  9. Python入门--python中的global
  10. 运算符重载,输出流运算符重载
  11. 身份证(省市)编码表
  12. 数据清洗Chap4——dataframe操作
  13. WebView load**方法 加载资源【总结】
  14. 微信小程序地图回到原点
  15. java把秒时长转换为分钟_java - 将秒值转换为小时分钟秒?
  16. SHFileOperation 文件拷贝、移动、删除等操作
  17. P1878 舞蹈课(二叉堆)
  18. 使用openssl生成https证书
  19. 激活函数(阶跃,sigmoid,relu,恒等,softmax)
  20. 24.多线程(等待唤醒机制,volatile,CAS 算法,线程池,定时器,设计模式)

热门文章

  1. mujava 软件测试实验报告
  2. 在测试集上训练,还能中CVPR?这篇IEEE批判论文是否合理?
  3. E - 秋实大哥与战争
  4. python获取代码行号
  5. 查看LoadRunner脚本请求日志和服务器返回值方法
  6. crontab脚本,定时任务相关细节
  7. json前台后台解析和拼接使用
  8. java面向对象(1)
  9. linux下各种连接慢的问题
  10. ldifde 神奇功效,对付英文系统下显示中文乱码哦