LeetCode202. 快乐数

一、题目描述

二、解法

class Solution {
    public boolean isHappy(int n) {
        /**
         * 方法1:用Set检测循环
         */
        /*Set<Integer> set = new HashSet<>();
        while (n != 1) {
            if (set.contains(n)) { //如果存在,说明陷入了死循环
                return false;
            }
            set.add(n);
            n = squareSum(n);
        }
        return true;*/
        /**
         * 方法2:类似于快慢指针的思想。
         *      慢指针每次做一次转换,快指针每次做两次转换
         *      如果出现死循环,那么快的指针(值)一定会追上慢的指针(值)
         *      如果没有循环重复,那么最后快慢指针也会相等,且都等于1。
         */
        int fast = squareSum(n);
        int slow = n;
        while (fast != 1 && fast != slow) {
            fast = squareSum(squareSum(fast));
            slow = squareSum(slow);
        }
        return fast == 1;

    }
    // 把一个数替换成每一位的平方和
    private int squareSum(int num) {
        int res = 0;
        while (num != 0) { // 一定要牢记代码实现取出各个位数字的思路
            int temp = num % 10;
            num /= 10;
            res += temp * temp;
        }
        return res;
    }
}

 

posted @ 2020-12-10 21:32  不学无墅_NKer  阅读(72)  评论(0)    收藏  举报