力扣202.快乐数(java语言HashSet方法,类双指针方法)

2023-11-10

前言:此题被分类到散列表算法题目中,但乍一看此题实在想不到如何去使用散列表,直到看了官方给的答案。。。。。。

题目描述:

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

「快乐数」 定义为:

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

在这里插入图片描述

解题思路及代码:

思路1:HashSet解法:

在题目对快乐数的定义中已经给出了两种情况我们分别举例出来:

1.是快乐数,即最后循环到1(19 ->82 -> 68 -> 100 -> 1)
2.不是快乐数,循环过程中出现死循环(也可以理解为出现了一个这也是想到使用类双指针方法的一个启示。)
在这里插入图片描述

我们第一眼凭直觉感觉还可能出现第三种情况:

3.循环的值越来越大,直至接近无穷大

若出现第三种情况我们编码将会变得很困难,因为我们怎么知道需要判断的数是会继续变大以至无穷大还是最终变为1?但是其实第三种情况是不存在在,此处就以力扣官方答案的证明为例(简洁明了)

位数 该位数最大的整数 最大数的下一位
1 9 81
2 99 162
3 999 243
4 9999 324
13 9999999999999 1053

我们们考虑不同位数的最大整数的下一位,三位最大整数位“999”,其下一位计算得到为“243”是一个三位数,当n为四位数时,最大整数“9999”的下一位为三位整数“324”,即说明四位数在循环的过程中要么会出现快乐数要么会在某个地方出现,反正其最终也会下降至三位数或者继续下降位数,同理,比四位数高的数亦如此(也就是位数最终都不会超过一个最大的位数)!!!

接下来就是解答开篇的疑惑:如何或者为何使用哈希表,我们讲大问题主要分成以下两部分:

1.按照题目实现数位分离并求取平方和
2.每次生成链中的下一个数字时,我们都检查其是否在哈希表中;若不在则添加,若已经在了,则说明此时已经在一个中,返回false。
所以我们选择哈希表就是便于将判断的时间复杂度降低!!!

代码:
class Solution {
	public boolean isHappy(int n) {
		HashSet<Integer> set = new HashSet<>();
		while (n != 1 && !set.contains(n)) {
			set.add(n);
			n = getNext(n);
		}
		return n == 1;
	}
	private int getNext(int n) {
		int totalSum = 0;
		while (n > 0) {
			int d = n % 10;
			n = n / 10;
			totalSum += d * d;	
		}
		return totalSum;
	}
}

思路二:类双指针法(快慢指针):

之所以叫做类快慢指针即不是正真意义的双指针,而是利用双指针的思想。由于我们在思路1已经发现若已经存在则说明不是快乐数,那我们可以使用快慢指针思想去类比解决此问题(此处推荐去练习一下力扣141.环形链表也可以使用快慢指针解决)

每次调用两次getNext()方法实现快指针每次移动两步,调用一次getNext()方法实现慢指针的移动
检测快慢指针是否相等,相等则说明存在

代码:
class Solution {
	public boolean isHappy(int n) {
		int slowRunner = n;
		int fastRunner = getNext(n);
		while (fastRunne != 1 && slowRunner != fasterRunner) {
			slowRunner = getNext(slowRunner);
            fastRunner = getNext(getNext(fastRunner));
		}
		return fastRunner == 1;
	}
	 private int getNext(int n) {
        int totalSum = 0;
        while (n > 0) {
            int d = n % 10;
            n = n / 10;
            totalSum += d * d;
        }
        return totalSum;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

力扣202.快乐数(java语言HashSet方法,类双指针方法) 的相关文章

  • Java - 为什么不允许 Enum 作为注释成员?

    It says 原始 String Class an Enum 另一个注释 上述任何一个的数组 只有这些类型才是合法的 Annotation 成员 为什么泛型 Enum 不能成为 Annotation 的成员 例如 Retention Re
  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • 如何安全地解决这个 Java 上下文类加载器问题?

    我的数百名用户中只有一位在启动我的 Java 桌面应用程序时遇到问题 他只有大约三分之一的时间开始 另外三分之二的时间在启动时抛出 NullPointerException Exception in thread AWT EventQueu
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • Java 8 流 - 合并共享相同 ID 的对象集合

    我有一系列发票 class Invoice int month BigDecimal amount 我想合并这些发票 这样我每个月都会收到一张发票 金额是本月发票金额的总和 例如 invoice 1 month 1 amount 1000
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • 在 Spring 中重构这个的最佳方法?

    private final ExecutorService executorParsers Executors newFixedThreadPool 10 public void parse List
  • Netty:阻止调用以获取连接的服务器通道?

    呼吁ServerBootstrap bind 返回一个Channel但这不是在Connected状态 因此不能用于写入客户端 Netty 文档中的所有示例都显示写入Channel从它的ChannelHandler的事件如channelCon
  • Cucumber Java 与 Spring Boot 集成 - Spring @Autowired 抛出 NullPointer 异常

    我正在为 Spring boot 应用程序编写 cucumber java 单元测试来测试每个功能 当我与 Spring Boot 集成时 Autowired 类抛出 NullPointer 异常 Spring Boot应用程序类 Spri
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • Eclipse 中 Spring MVC 模型对象的 (jsp /jstl) 视图中的代码辅助

    在 Spring MVC 中 当将对象放置在视图模型中时 如下所示 public String getUser Model model fetch user model addAttribute user user return viewN
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu

随机推荐