每日一题:Leetcode202.快乐数

题目描述

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

输入:n = 2
输出:false

思路:刚拿到题没有一点思路,仔细分析后发现题目第二行如果这个数变为一那么循环下去一定为1,也可能是无限循环但始终变不到1。那么我们就可以将该问题转化为链表带环问题。两种情况都带环循环下去,那么就比较环里的值是否为1,为1则返回true。

链表带环+快慢指针

此链表非传统意义上的链表问题,而是通过每次各个位置上的值相加后迭代向后走,快指针一次走两步(各个位置的值相加进行两次),慢指针一次走一步,直到快慢指针相遇。

代码实现

class Solution {
public:
    int bitSum(int n)
    {
        int sum=0;
        while(n)
        {
            int t=n%10;
            sum+=t*t;
            n/=10;
        }
        return sum;
    }
    bool isHappy(int n)
    {
        int slow=n,fast=bitSum(n);
        while(slow!=fast)
        {
            slow=bitSum(slow);
            fast=bitSum(bitSum(fast));
        }
        return slow==1;
    }
};

代码解释:定义一个bitSum函数来实现各个位置的和,调用一次该函数即代表指针向前走一步,接着就是找环内相遇点,最后返回环内的值是否为1,为1则是快乐数。

每日一句:

自律个屁只是那种快感超过了冲

你可能感兴趣的:(算法)