leetcode题目——Happy Number
题目:
编写一个算法来判断一个数 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相关推荐
- LeetCode:Largest Number - 求整型数组中各元素可拼合成的最大数字
2019独角兽企业重金招聘Python工程师标准>>> 1.题目名称 Largest Number(求整型数组中各元素可拼合成的最大数字) 2.题目地址 https://leetco ...
- [LeetCode]179. Largest Number
[LeetCode]179. Largest Number 题目描述 解题思路 求最大的数,在数组中对于每一位数字数值越大应当越靠前,如:9 > 5,所以9应该在5之前 需要考虑的是对于不同位数 ...
- LeetCode 871. Minimum Number of Refueling Stops 最少加油次数
LeetCode 871. Minimum Number of Refueling Stops 本题是LeetCode 871题,最少加油次数. 题目描述 A car travels from a s ...
- LeetCode: 871. Minimum Number of Refueling Stops
LeetCode: 871. Minimum Number of Refueling Stops 题目描述 A car travels from a starting position to a de ...
- Leetcode 179 Largest Number
Leetcode 179 Largest Number 题目 思路 代码 优化 题目 Given a list of non negative integers, arrange them such ...
- Leetcode题目练习总结(持续更新......)
Leetcode题目练习 数组 1.两数之和 26. 删除排序数组中的重复项 27. 移除元素 35.搜索插入位置 53.最大子序列 66.加一 88.合并两个有序数组 118.杨辉三角 119.杨辉 ...
- “手把手撕LeetCode题目,扒各种算法套路的裤子”
出品 | AI科技大本营(ID:rgznai100) 刷LeetCode刷到懵还是一头雾水? 莫慌,这里有一个标星27000+的算法详解教程. 从项目命名来看,作者labuladong就有着要干翻算法 ...
- python检索地址_35.leetcode题目讲解(Python): 搜索插入位置
题目如下: image.png 这道题使用双指针折半查找比较容易解,指的注意的是,如果出现插入元素与输入数组里的元素相同,需要插入到相同元素的位置,比如: [8,5,3],5 应该返回1,而不是2. ...
- Github标星59.7k:用动画的形式呈现解LeetCode题目的思路
前些日子推荐了一个仓库,把常见算法用python语言实现了(见文章),近日在github上发现另外一个59700多star的仓库,用动画的形式呈现解LeetCode题目的思路,非常值得推荐. 仓库说明 ...
最新文章
- android fragment activity 交互,Android基础之Fragment与Activity交互详解
- Excel公式不同引用地址方式的应用总结
- 二维矩阵与二维矩阵之间的卷积
- randn函数加噪声_损失函数 (Loss Function)
- VTK修炼之道58:图形基本操作进阶_点云配准技术(迭代最近点ICP算法)
- 【TensorFlow】占位符:tf.placeholder,与feed_dict
- 配置MongoDB复制集
- ReentrantLock可重入锁
- 超252万市民预约报名 北京数字人民币红包中签结果公布啦
- rust种的南瓜为什么老是消失_科技的力量!3种“奇葩”的发明,你都见过吗?...
- gwt CellTable中的控件按Tab键切换
- excel根据条件列转行_Excel vba-根据不同筛选条件筛选后,拆分成新的excel工作簿...
- LINUX下载编译opusfile/opus-tools
- APN PDP PPP解释
- 小学五年级计算机教学论文,小学五年级数学教学论文
- 并发编程-并发编程的挑战
- jupyter notebook 用PPT展示代码 +插入图片
- Marvell交换机芯片SMI接口读写协议
- 浙江科技学院计算机专业录取分数线,浙江科技学院2015年艺术类专业录取分数线...
- Android 模拟器连接 USB 设备