Leetcode - Happy Number算法总结

Happy Number算法submit了好几次,才最终测试通过,总结一下。

1. Happy Number定义

给定一个整数,将每一位数字的平方加起来,得出来一个和,继续将这个和的每一位数字的平方加起来,不断循环,如果最终的和是1的话,那么该整数即为Happy Number.

举例:
Input: 19
Output: true
Explanation:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

2. 算法基本思想

1)取余运算得到最后一位数
2)求取平方,累加
3)除法运算得到十位靠左的所有数
4)如果这个除法结果为0,那么运算完成,开始对结果进行循环1 -3 的运算

基本的思想就可以完成了,但是有一个地方需要注意的是,如果给定的数字是2,那么处理结果是这样的:

2,4,16,37,58,89,145,42,20,4,16,37.......

这样就进入了死循环了,需要做处理。

3. 参考代码

下面是我的参考算法代码:

class Solution {
public:
    bool isHappy(int n) {
        int result = 0;
        int temp = n;
        vector<int> resultVect;
        int numbersResult = 0;
        
        if (n < 0 || n > numeric_limits<int>::max()) return false;
        
        while (temp) {
            result += pow(temp%10, 2);
            temp = temp/10;
            
            if (temp == 0) { 
                
                // check for loops endlessly
                resultVect.push_back(result);
                numbersResult = 0;
                for (auto & x : resultVect) {
                    if (x == result) numbersResult++;
                    if (numbersResult == 2) return false;  
                }
                
                if (result == 1) return true;
                temp = result;
                result = 0;
            }
        }
        
        return false;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值