202.快乐树

(写给未来遗忘的自己)

class Solution {
public:
    bool isHappy(int n) {
    std::unordered_set<int> sum_set;
    while(true){
        int sum=add_sum(n);
        if(sum_set.find(sum)!=sum_set.end()){
            return false;
        }
        if(sum==1){
            return true;
        }else{sum_set.insert(sum);}
        n=sum;
    }
    }
    int add_sum(int n){
        int sum=0;
        int n_n=n;
        while(n_n){
            sum+=(n_n%10)*(n_n%10);
            n_n=n_n/10;
        }
        return sum;
    }
};

 做题的思维:

1. 思考如何会出现,如何永远不出现?

位置上的数平方后的和,如果和出现了相等的情况,那么就意味着陷入了死循环,永远求解不到解,所以只要不进入死循环就让他一直求解下去。

2. 怎么快速查是否相等的和存在?

利用 unordered_set的哈希数表。查找的速度为log(n)。

if(sum_set.find(sum)!=sum_set.end()){
            return false;
     }
//从头遍历一遍,不等于尾部就说明找到了

3. 怎么可以做到求解位数的平方呢?

一个整数对10取余就得到最后一位数,然后整数对10取商就剔除最后一位,倒数第二位成为最后一位,一直循环,直到取商为0;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值