题目:

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

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

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

第一步:需要将每一位的数字单独拿出来求平方

整数最大为10位数,但用1000000000*10之后就无法运行,所以会报错,那么添加一个计数器k,最终k为11但终止循环,导致m不会再增加。

bool isHappy(int n){n = 375231;int r = 0;int m = 1;for (int k = 1; k <= 10; k++){int d = n / m % 10;//d: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10//m: 1, 10, 100, ..., 1000000000//k: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11printf("%d\n",d);r += d * d;if (k < 10){m *= 10; }}return false;
}

另一种想法是倒过来做,这样输出的位数是从高位到低位

bool isHappy(int n){int r = 0;int m = 1;for (int m = 1000000000; m >= 1; m /= 10){int d = n / m % 10;r += d * d;}}printf("%d\n",r);return false;
}

简化写法(不断将原本的数字/10)

bool isHappy(int n){int r = 0;while (n != 0){int d = n % 10;n /= 10;r += d * d;}printf("%d\n",r);return false;
}
第二步:对其进行循环
int next_n(n){int r = 0;while (n != 0){int d = n % 10;n /= 10;r += d * d;}return r;
}
bool isHappy(int n){printf("%d\n",next_n(n));return false;
}

我们需要知道,程序做到什么时候才停止,检查数字n是否出现过,当他没有出现过,一直走,当n再次出现时有两种情况,①n为1,此事是happy number ②n不会1,则为false。

int next_n(n){ //回传下一次的nint r = 0;while (n != 0){int d = n % 10;n /= 10;r += d * d;}return r;
}
bool contain(int* history, int size, int n){ //检查 n 是否在 history 中出现过for (int i =0; i < size; i++){if (history[i] == n){return true;}}return false;  //false的意思就是它没有出现过
}
bool isHappy(int n){int history[10000]; // 我们去过哪里int size = 0;  //总共有几个地方//history = [?,?,?,?,?,?]//size = 0// n = 19while (!contain(history, size, n)){history[size] = n; //histort[0]=19size++;n = next_n(n);  // n : 82}return n == 1;
}
疑问:有没有可能产生的新的数字超过一万个?

想想如果有10位数,每位数均为最大,9999999999 ==》 9 * 9 * 10 =810
他运算的数字最大为810
我们可以在循环前第一次先无条件走一步,此时次数最多就只有810种不一样。
但是确定空间大小仍是不确定的,所以可以让其变循环,空间逐渐长大

龟兔赛跑算法(Floyd’s Tortois and Here)


一开始都在起点,乌龟一次走一步,兔子一次走两步,兔子会从尾巴上追上乌龟并且撞在一起,此时便说明会有循环发生,对于此题,我们需要检查当两者撞在一起时是否为1即可。

双指标方法:
int next_n(n){ //回传下一次的nint r = 0;while (n != 0){int d = n % 10;n /= 10;r += d * d;}return r;
}
bool isHappy(int n){int slow = n;int fast = n;do{                     //一开始两个是在一起的slow = next_n(slow); //乌龟走一步fast = next_n(next_n(fast));//兔子走两步} while (slow != fast);  //走完之后就要检查两个是否撞在一起,当不一样时,继续做return fast == 1; // 检查乌龟和兔子都可以
}

不需要额外的阵列占用空间。

class Solution:def getNext(self, n: int) -> int:next_n = 0while(n != 0):next_n += (n % 10) ** 2n = n // 10return next_ndef isHappy(self, n: int) -> bool:slow = nfast = self.getNext(n)while(fast != 1 and slow != fast):slow = self.getNext(slow)fast = self.getNext(self.getNext(fast))return fast == 1作者:coldme-2
链接:https://leetcode-cn.com/problems/happy-number/solution/hashsetshuang-zhi-zhen-python-by-coldme-2/

leetcode题目——Happy Number相关推荐

  1. LeetCode:Largest Number - 求整型数组中各元素可拼合成的最大数字

    2019独角兽企业重金招聘Python工程师标准>>> 1.题目名称 Largest Number(求整型数组中各元素可拼合成的最大数字) 2.题目地址 https://leetco ...

  2. [LeetCode]179. Largest Number

    [LeetCode]179. Largest Number 题目描述 解题思路 求最大的数,在数组中对于每一位数字数值越大应当越靠前,如:9 > 5,所以9应该在5之前 需要考虑的是对于不同位数 ...

  3. LeetCode 871. Minimum Number of Refueling Stops 最少加油次数

    LeetCode 871. Minimum Number of Refueling Stops 本题是LeetCode 871题,最少加油次数. 题目描述 A car travels from a s ...

  4. LeetCode: 871. Minimum Number of Refueling Stops

    LeetCode: 871. Minimum Number of Refueling Stops 题目描述 A car travels from a starting position to a de ...

  5. Leetcode 179 Largest Number

    Leetcode 179 Largest Number 题目 思路 代码 优化 题目 Given a list of non negative integers, arrange them such ...

  6. Leetcode题目练习总结(持续更新......)

    Leetcode题目练习 数组 1.两数之和 26. 删除排序数组中的重复项 27. 移除元素 35.搜索插入位置 53.最大子序列 66.加一 88.合并两个有序数组 118.杨辉三角 119.杨辉 ...

  7. ​“手把手撕LeetCode题目,扒各种算法套路的裤子”

    出品 | AI科技大本营(ID:rgznai100) 刷LeetCode刷到懵还是一头雾水? 莫慌,这里有一个标星27000+的算法详解教程. 从项目命名来看,作者labuladong就有着要干翻算法 ...

  8. python检索地址_35.leetcode题目讲解(Python): 搜索插入位置

    题目如下: image.png 这道题使用双指针折半查找比较容易解,指的注意的是,如果出现插入元素与输入数组里的元素相同,需要插入到相同元素的位置,比如: [8,5,3],5 应该返回1,而不是2. ...

  9. Github标星59.7k:用动画的形式呈现解LeetCode题目的思路

    前些日子推荐了一个仓库,把常见算法用python语言实现了(见文章),近日在github上发现另外一个59700多star的仓库,用动画的形式呈现解LeetCode题目的思路,非常值得推荐. 仓库说明 ...

最新文章

  1. android fragment activity 交互,Android基础之Fragment与Activity交互详解
  2. Excel公式不同引用地址方式的应用总结
  3. 二维矩阵与二维矩阵之间的卷积
  4. randn函数加噪声_损失函数 (Loss Function)
  5. VTK修炼之道58:图形基本操作进阶_点云配准技术(迭代最近点ICP算法)
  6. 【TensorFlow】占位符:tf.placeholder,与feed_dict
  7. 配置MongoDB复制集
  8. ReentrantLock可重入锁
  9. 超252万市民预约报名 北京数字人民币红包中签结果公布啦
  10. rust种的南瓜为什么老是消失_科技的力量!3种“奇葩”的发明,你都见过吗?...
  11. gwt CellTable中的控件按Tab键切换
  12. excel根据条件列转行_Excel vba-根据不同筛选条件筛选后,拆分成新的excel工作簿...
  13. LINUX下载编译opusfile/opus-tools
  14. APN PDP PPP解释
  15. 小学五年级计算机教学论文,小学五年级数学教学论文
  16. 并发编程-并发编程的挑战
  17. jupyter notebook 用PPT展示代码 +插入图片
  18. Marvell交换机芯片SMI接口读写协议
  19. 浙江科技学院计算机专业录取分数线,浙江科技学院2015年艺术类专业录取分数线...
  20. Android 模拟器连接 USB 设备

热门文章

  1. 简约商务报告PPT模板
  2. 计算机二级Excel考点精讲(—)
  3. Java -- 面向对象【接口】
  4. 想做一个完美的健身训练计划,你须要知道什么?
  5. 11.PS-橡皮擦工具组
  6. 洛谷P1318:积水问题(Java实现)
  7. 关于字节(内存)对齐
  8. c语言中leap是什么意思,C++中leap是什么
  9. 牛牛的跳跳棋【贪心】
  10. python实现2048小游戏_python—手把手教你实现2048小游戏