[快乐数](哈希表)

思路

核心思路:使用哈希集合检测循环

  1. 计算平方和:编写辅助函数计算数字各位数字的平方和
  2. 循环检测:使用哈希集合记录已经出现过的数字
  3. 终止条件
    • 如果得到1,返回true
    • 如果数字重复出现,说明进入循环,返回false

代码实现分析

cpp 复制代码
class Solution {
public:
    // 辅助函数:计算数字各位数字的平方和
    int sum(int n) {
        int ans = 0;
        while (n > 0) {
            int d = n % 10;  // 获取最后一位数字
            n /= 10;         // 去掉最后一位
            ans += d * d;    // 平方并累加
        }
        return ans;
    }
    
    // 主函数:判断是否是快乐数
    bool isHappy(int n) {
        unordered_set<int> mp;  // 用于记录已经出现过的数字
        
        while (n != 1) {       // 循环直到得到1
            n = sum(n);        // 计算平方和
            
            // 如果这个数字已经出现过,说明进入循环
            if (!mp.count(n)) {
                mp.insert(n);   // 记录新数字
            } else {
                return false;   // 出现重复,不是快乐数
            }
        }
        
        return true;  // 得到1,是快乐数
    }
};
1. 平方和计算函数
cpp 复制代码
int sum(int n) {
    int ans = 0;
    while (n > 0) {
        int d = n % 10;  // 取最后一位数字
        n /= 10;         // 去掉最后一位
        ans += d * d;    // 平方累加
    }
    return ans;
}
  • 例如:n=19 → 1²+9²=82
  • 例如:n=82 → 8²+2²=68
2. 主循环逻辑
cpp 复制代码
while (n != 1) {
    n = sum(n);  // 计算下一个数字
    
    if (!mp.count(n)) {  // 如果数字未出现过
        mp.insert(n);    // 记录
    } else {             // 如果数字已出现过
        return false;    // 检测到循环
    }
}