前言
学习了环形链表的抽象概念后,我们来搞个环形链表的应用题,求个快乐数你不快乐吗
逻辑解析
题目: 编写一个算法来判断一个数 n 是不是快乐数。
什么样叫快乐数呢?
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果 可以变为 1,那么这个数就是快乐数。
- 平方和最终变为1意味什么 =》 求和到了终点 =》 理解链表终点指向了null
- 无限循环始终变不到1意味什么 =》 求和的结果在循环 =》 链表有环可以无限奔跑
- 那么理解为链表我们能做什么? =》 利用快慢指针求解链表有无环的过程就是判定快乐数的过程,无环则说明是快乐数,有环则不是。
开始解题
模拟快慢指针 1次求平方和的过程就相当于跑得慢的甲1步一个节点,2次求和相当于跑得快的乙1步两个节点
判断有无环
var isHappy = function(n) {
let pre = getNext(n),cur = getNext(getNext(n));
while(pre != cur) {
pre = getNext(pre); // 相当于甲1步1节点,getNext的求和方法就相当于next指针
cur = getNext(getNext(cur)); // 相当于乙1步2节点
}
return pre == 1; // pre和cur相等除了等于1之外是快乐数,等于其他值都说明链表有环
};
求和方法
var getNext = function(n) {
let sum = 0;
let t = n;
while(t) {
sum += (t%10)*(t%10); // 每次对10取余数拿到个位数的平方和
t = Math.floor(t/10); // 每次求和之后让正整数t缩小10倍向下取整,让原本的10位数变为下一次求和的个位数,依次类推
}
return sum;
}