目录
1,题目
编写一个算法来判断一个数 n
是不是快乐数。如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
2,代码
2.1哈希算法
/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function(n) {
// 数位分离,求平方和
const getNext = (n) => {
let totalSum = 0;
while (n > 0) {
let d = n % 10;
n = Math.floor(n / 10);
totalSum += d * d;
}
return totalSum;
};
// 函数主题
const hashtable = new Set()
while(n!=1 && !hashtable.has(n)){
hashtable.add(n);
n=getNext(n);
}
return n===1;
};
2.2快慢指针
/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function(n) {
// 数位分离,求平方和
const getNext = (n) => {
let totalSum = 0;
while (n > 0) {
let d = n % 10;
n = Math.floor(n / 10);
totalSum += d * d;
}
return totalSum;
};
// 快慢指针构造
let slowRunner = n;
let fastRunner = getNext(n);
while(fastRunner!=1 && fastRunner!=slowRunner){
slowRunner=getNext(slowRunner);
fastRunner=getNext(getNext(fastRunner));
}
return fastRunner === 1;
};
3,学习与总结
3.1题目分析
(1)初步判断 出现的情况有:
- 最终得到1
- 最终陷入循环
- 值会趋近无穷大
(2)对 值是否会趋近无穷大 的情况进行分析
思考出发点:每一位数的最大数字的下一位数是多少。
对于 3位数的数字,它不可能大于 243。这意味着它要么被困在 243 以下的循环内,要么跌到 1。4位或 4位以上的数字在每一步都会丢失一位,直到降到 3位为止。
所以我们知道,最坏的情况下,算法可能会在 243以下的所有数字上循环,然后回到它已经到过的一个循环或者回到 1。但它不会无限期地进行下去,所以我们排除第三种选择。
作者:力扣官方题解
(3)从而 一共有两种情况:
- 最终获得1
- 陷入循环
3.2 算法实现
(1)哈希算法
- 哈希表来管理生成的数字,一旦有数字已经出现在哈希表中,则说明会陷入循环;
(2)快慢指针算法
- 生成一个隐式链表;
- 跟踪两个值,称为快跑者和慢跑者;快跑者在链表中前进两个节点,,慢跑者在链表中前进一个节点;
- 循环体内,快跑者会和慢跑者‘相遇’;
3.3总结
题目背后的情况分析;
算法的应用;
勉励自己:贵在坚持!