首页 > 其他分享 >Leetcode | 202 Happy Number

Leetcode | 202 Happy Number

时间:2024-08-09 13:27:40浏览次数:16  
标签:202 dolphinmind int Number public 循环 哈希 import Leetcode

分析

在快乐数的题意上,通常情况下我们都会去顺着题目的意思去寻找最终结果是否为1,而后面的另一句话很有启示意义:"也可能是无限循环,但始终变不到1",那么为什么不会是无限不循环呢?

证明

  • 范围限制:对于一个(d)位数的正整数(n),其最大值为 99d =Max
  • 位数减少:每次计算之后,数字位数d要么减少,要么保持不变,范围限制提供了一个位数的最大边界
  • 有限状态空间:在Max这个数字范围限制下,即便所得的结果,将这个空间里面的所有元素全部遍历一遍,想陷入无限不循环则是不可能的,一定会出现重复计算过的数字,从而进行无限循环之中

从上面的证明,我们可以分析得出,在有限的状态空间,只有1的平方进入无限循环,自己乘自己还是自己,其它的数会在这个有限空间里面收缩,计算结果要么为1,要么就会在这个空间里不停重复,重复检测最好的方式刚好是哈希表,产生了哈希冲突就代表有重复值出现,与检测链表中是否存在环结构,不谋而合。

循环检测:快乐数的检测过程实际上是一个寻找循环的过程,无论是1自身的循环,还是在有限空间内的循环。这种思想可以应用于检测链表中的循环、图中的环路等问题

哈希表:使用哈希表来存储已经计算过的值,可以避免重复计算,提高效率。在实际应用中,哈希表常用于缓存、去重、快速查找等场景

取余运算和利用余数作为循环条件这个小技巧挺精致

主类

package com.github.dolphinmind.hash;

import java.util.HashSet;
import java.util.Set;

/**
 * @author dolphinmind
 * @ClassName HappyNumber
 * @description
 * @date 2024/8/9
 */

public class HappyNumber {

    public boolean isHappy(int n ) {

        Set<Integer> seen = new HashSet<>();

        /**
         * n == 1 是快乐数的判断标准
         * seen.contains(n) 是判断是否出现过n,即判断是否进入了循环
         */
        while (n != 1 && !seen.contains(n)) {
            seen.add(n);
            n = getSquareSum(n);
        }

        return n == 1;
    }

    private int getSquareSum(int n) {
        int sum = 0;

        while (n > 0) {
            int digit = n % 10;
            sum += digit * digit;
            n /= 10;
        }
        return sum;
    }
}

测试类

package com.github.dolphinmind.hashcode;

import com.github.dolphinmind.hash.HappyNumber;
import org.junit.Test;

/**
 * @author dolphinmind
 * @ClassName HappyNumberTest
 * @description
 * @date 2024/8/9
 */

public class HappyNumberTest {

    @Test
    public void test_IsHappy() {

        System.out.println(new HappyNumber().isHappy(19));
    }
}

标签:202,dolphinmind,int,Number,public,循环,哈希,import,Leetcode
From: https://www.cnblogs.com/dolphinmind/p/18350600

相关文章

  • Leetcode热题100-128.最长连续序列
    Leetcode热题100-128.最长连续序列1.题目描述2.解题思路3.代码实现1.题目描述128.最长连续序列2.解题思路使用哈希集合的思想:初始化一个unordered_set并将nums中所有元素放入集合中;遍历数组,依次判断当前元素是否为连续序列的开始,若是则求出当前连续序列......
  • 福昕高级PDF编辑器专业版 v2024 激活版
    福昕高级PDF编辑器是一款功能强大的PDF文件编辑软件,提供多种实用的编辑功能。软件功能:PDF文档编辑:用户可编辑PDF文档内容,包括文字、图片、表格、图形等,且不会对原有文本内容造成影响。批注工具:提供多种批注工具,如注释,连线框和浮动注释,在PDF文件中添加批注和标记以便于阅读。......
  • 打卡信奥刷题(528)用Scratch图形化工具信奥B2020[普及组/提高] 分糖果
    分糖果题目描述某个幼儿园里,有555位小朋友编号依次为1,2......
  • 福昕高级PDF编辑器专业版 v2024 激活版
    福昕高级PDF编辑器是一款功能强大的PDF文件编辑软件,提供多种实用的编辑功能。软件功能:PDF文档编辑:用户可编辑PDF文档内容,包括文字、图片、表格、图形等,且不会对原有文本内容造成影响。批注工具:提供多种批注工具,如注释,连线框和浮动注释,在PDF文件中添加批注和标记以便于阅读。......
  • Codeforces 165E Compatible Numbers 题解
    思路高维前缀和高维前缀和把数的二进制看成一个集合,二进制的每一位为\(1\)为全集\(V\)。根据题目描述,若两数\(a,b\)相容,则\(a\operatorname{and}b=0\),容易发现,\(b\in\complement_{V}a\),所以我们只需要用高维前缀和处理出\(\complement_{V}a\)的一个元素即可。......
  • 2024年远程控制新趋势,安全更高效,ToDesk领航远程办公
    随着科技的迅速发展和互联网的普及,远程控制技术整逐渐成为现代办公的新常态。越来越多的企业和个人开始认识到远程控制所带来的便捷性和高效性,尤其在全球化和远程办公的环境下,远程控制已成为一种不可或缺的办公工具。经过数年的沉淀和发展,远程控制软件的功能也在不断地演变和优化......
  • leetcode考试题
       +-------------+----------+|ColumnName|Type|+-------------+----------+|id|int||client_id|int||driver_id|int||city_id|int||status|enum||request_at|varchar|......
  • LeetCode | 349 Intersection Of Two Arrays
    分析两个数组的交集,双指针使用的前提是,两个数组已经处于有序状态。双指针的本质是遍历;双指针在线性数据结构中,进行数据处理,每次只专注于两个元素;指针遍历将问题拆解为两部分,即已解决和待解决问题。倘若两个数组是无序的状态,双指针指向每次都无法确认是否在历史中已经出现过,这个时......
  • 2024.7.28 模拟赛10
    模拟赛\(long\long\ago\)。。。T1CompanyAcquisitions鞅的停时定理。赛时应该不可做的吧。手膜两组样例发现肯定不能用常规方法做。然后开始新科技。势能函数!!!设计一个势能函数去表示一种状态,这个势能函数要满足每操作一步势能减一,这样初势能减末势能就是期望步数。(是......
  • IntelliJ IDEA 2024.2 发布:Spring Data JPA即时查询、自动补全cron表达式
    今早看到,IntelliJIDEA2024.2发布的邮件提示,看了一眼这个版本更新的新特性真的太适合我了!也许这些能力对关注DD的小伙伴也有帮助,所以搞篇博客介绍和推荐一下。下面就来一起看看这个版本中推出的几个强大新特性。SpringDataJPA的即时查询在2024.2Ultimate版本中,对Spring......