202. Happy Number

https://leetcode.com/problems/happy-number/

给定一个数字,每一次拿出这个数字 abc 的每一位执行 \(a^2 + b^2 + c^2\) ,得到一个新的数,然后再把新的数进行逐位平方取和,如果最后面得到的值为1,那么这个数就是 happy number

分析:

对于一个数A,经过一系列上面的操作后,达到数字B,经过一系列操作,最后还会到数字B,即 A --> B --> B --> B,因此我们需要找到是否出现了循环

  • 这里采用快慢指针的方法,快的比慢的每次多跑2步,这样子快的会追上慢的,形成一个环;出现这种情况后再判断此时的值是否是1,如果是1就是快乐数
  • 也可以使用 hashset, 判断经过操作后的值是否之前出现了,由于hashset需要占据空间,因此这里不采用
class Solution {
public:
    bool isHappy(int n) {
        int n1 = n, n2 = next(n);
        while(n1!=n2 && n2 != n)
        {
            n1 = n2;
            n2 = next(n2);
        }
        if(n1==1)
            return true;
        else
            return false;
    }
    
private:
    int next(int n)
    {
        int result=0, temp=0;
        while(n)
        {
            temp = n%10;
            result += temp*temp;
            n/=10;
        }
        return result;
    }
};

还有一种方法:对于非快乐数,最后面肯定会到达4(待证明),因此只要判断每次经过上述操作是否得到4

class Solution {
public:
    bool isHappy(int n) {
        int result=0;
        while(n!=1 && n!=4){
            int result=0;
            while(n)
            {
                result += (n%10) * (n%10);
                n/=10;
            }
            n = result;
        }
        return n==1;
    }
};
posted @ 2020-04-02 23:44  默写年华  阅读(124)  评论(0编辑  收藏  举报