力扣-202. 快乐数解析-弗洛伊德循环查找算法

题目链接

 

public static void Happy(int n) {
        int sum = 0;
        int digit = 0;
        for (int i = 0; i < 20; i++) {
            while (n != 0) {
                digit = n%10;
                sum += digit*digit;
                n/=10;
            }
            System.out.print(sum + " ");
            n = sum;
            sum = 0;
        }
    }

使用代码测试一下每一代数字 

n = 2 :
4 16 37 58 89 145 42 20 4 16 37 58 89 145 42 20 4 16 37 58 
n = 3 :
9 81 65 61 37 58 89 145 42 20 4 16 37 58 89 145 42 20 4 16 
n = 4 :
16 37 58 89 145 42 20 4 16 37 58 89 145 42 20 4 16 37 58 89 
n = 5 :
25 29 85 89 145 42 20 4 16 37 58 89 145 42 20 4 16 37 58 89 
n = 6 :
36 45 41 17 50 25 29 85 89 145 42 20 4 16 37 58 89 145 42 20 
n = 7 :
49 97 130 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

可以发现

归纳一下这些简单数字就可以发现,对于任意一个非快乐数,最终会进入重复循环, ···不难发现,4即之后的结果就是新一轮循环。

那么我的第一个做法是检测4出现的次数 如果4出现次数超过两次, 那么就不是快乐数

{
        int sum = 0;
        int n1 = n;
        int count = 0;
        for (int i = 0;  ; i++) {
            while (true) {
                int a = n%10;
                sum += a*a;
                n /= 10;
                if (n == 0){break;}
            }
            if (sum==4){
                count++;
            }
            if (sum==1){return true;}
            if (count==2){return false;}
            n = sum;
            sum=0;
        }

    }

感觉不太行 

想了一想 其实这道题为弗洛伊德查找算法提供了很好的条件

弗洛伊德查找算法原理见此处链接

代码如下:

{
    //弗洛伊德循环查找算法
    public static boolean isHappy(int n) {
        int slow = n;
        int fast  = n;
        while (true) {
            slow = Next(slow);
            fast = Next(Next(fast));
            if (fast == 1) {
                return true;
            } else if (fast == slow) {
                return false;
            }
        }
    }
    public static int Next(int n){
        int sum = 0;
        while (n != 0){
            int digit = n % 10;
            sum += digit*digit;
            n /= 10;
        }
        return sum;
    }
    public static void main(String[] args) {
        System.out.println(isHappy(19));
    }
}

当测试用例为2这个数字的时候

4 16 37 58 89 145 42 20 4 16 37 58 89 145 42 20 4 16 37 58 

第一步初始化slow和fast两个指针为头结点 (就是2)

第一次更新值

第二次

第三次

第四次

第五次

第六次

第七次

第八次

此时slow== fast

发现为循环链表(这里没有存储之前的值算不上链表)

return false

舒服了

如果觉得有用请点赞收藏, 谢谢啦

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-01-20 17:00:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-20 17:00:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-20 17:00:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-20 17:00:04       20 阅读

热门阅读

  1. 解决el-radio-group只触发一次的问题

    2024-01-20 17:00:04       38 阅读
  2. Ubuntu18.04 gcc找不到

    2024-01-20 17:00:04       36 阅读
  3. 开源软件合规风险与开源协议的法律效力

    2024-01-20 17:00:04       37 阅读
  4. Elasticsearch 中的 term、terms 和 match 查询

    2024-01-20 17:00:04       38 阅读
  5. ACL访问控制列表

    2024-01-20 17:00:04       37 阅读
  6. Centos7系统没有tab补全功能

    2024-01-20 17:00:04       36 阅读
  7. 判断自守数

    2024-01-20 17:00:04       36 阅读
  8. 算法训练营Day35(贪心4)

    2024-01-20 17:00:04       36 阅读
  9. 用python解二元一次方程

    2024-01-20 17:00:04       34 阅读