算法刷题:快乐数

快乐数

  • .
  • 习题链接
  • 题目
  • 题目解析
  • 初始值
  • 算法原理
  • 我的答案

.

算法刷题:快乐数_第1张图片

习题链接

快乐数

题目

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

「快乐数」 定义为:

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

题目解析

分析题目,可以得到两种结果:

  1. 一直在1这个数上死循环,如:1->1->1…
  2. 在历史的数据中进行死循环,但始终不为1

由上面两种结果可以推断出:结果必定会出现死循环,我们只需要找到死循环后进入循环圈中的一个数,判断这个数是否为1,就可以判断出该正整数是否为快乐数.
那么问题很明确,我们现在需要做的是,找到那个进入循环圈的数,这里我们使用双指针中的快慢指针来完成

初始值

fast: bitSum(n)
slow: n
因为后面进行while循环的时候,判断条件是fast!=slow,因此需要让fast与slow的初始值错开一位

算法原理

fast这个指针每次进行两次求平方和,而slow则是进行一次求平方和,循环执行该步骤,直到fast与slow相等,则说明已经找到了一个在循环圈里的数

我的答案

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

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