如何计算我的快乐数(Happy Number)函数的Big O时间复杂度?
LeetCode 202题「快乐数」代码的时间复杂度分析
我知道这并非LeetCode第202题「快乐数」的最优实现,但我想要分析这段带有条件while循环的代码的时间复杂度Big O。另外,当n的初始值为0-4时,时间复杂度为O(1)。
/** * @param {number} n * @return {boolean} */ var isHappy = function(n) { /* pseudocode - n is input - while loop if num is greater than 1 - turn number to string - split the string - map to an array - add all numbers' squares - if num is 1, break and return true - if not loop */ // check for definite false cases if (n === 1) { return true; } else if (n === 0|| n === 2 || n === 3 || n === 4) { return false; } while (n > 1) { // split and turn to string n = n.toString().split(""); console.log(n); // map to arr //let tempArr = n.map(n); console.log("n: " + n); // add all nums squares let tempNum = 0; n.forEach(e => { tempNum += (e**2); console.log("adding ", e**2); }); // change n to sum and reset tempNum n = tempNum; tempNum = 0; // check conditions for true/false if (n === 1) { return true; } else if (n === 0|| n === 2 || n === 3 || n === 4) { return false; } } };
时间复杂度分析
核心前提:快乐数的迭代收敛特性
不管初始输入的n有多大,经过有限次迭代后,结果只会出现两种情况:
- 收敛到1(快乐数,直接返回true)
- 进入固定循环:
4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4(非快乐数,遇到4直接返回false)
这意味着while循环的迭代次数是固定常数,不会随n的大小无限增长(实际测试中,最大迭代次数不超过20次,属于常数范畴)。
单次迭代的时间开销
每次while循环里的核心操作:
- 将n转为字符串并拆分:操作的时间取决于n的位数,而一个数n的位数是
O(log₁₀n)(等价于O(log n),对数底数不影响大O复杂度)。 - 遍历拆分后的数组计算平方和:同样需要遍历每一位数字,时间开销也是
O(log n)。
因此单次迭代的时间复杂度是O(log n)。
整体时间复杂度
由于迭代次数是常数,常数次的O(log n)操作叠加后,整体时间复杂度仍为O(log n)。
特殊情况
当n的初始值为0-4时,代码直接通过条件判断返回结果,无需进入循环,此时时间复杂度为O(1)。
内容的提问来源于stack exchange,提问作者Sfzmango
相关产品推荐
相关产品推荐

