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

news2024/11/15 13:31:03

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

题目描述:

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

「快乐数」 定义为:

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

在这里插入图片描述

解题思路及代码:

思路1:HashSet解法:

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

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

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

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

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

位数该位数最大的整数最大数的下一位
1981
299162
3999243
49999324
1399999999999991053

我们们考虑不同位数的最大整数的下一位,三位最大整数位“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;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 基本语法

&#x1f4d2;博客主页&#xff1a; ​​开心档博客主页​​ &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由开心档原创&#xff01; &#x1f4c6;51CTO首发时间&#xff1a;&#x1f334;2022年12月12日&#x1f334; ✉…

Python40个自动化办公实战案例,终于实现下班自由啦~

拿来就能用&#xff0c;这么爽的吗&#xff1f;&#xff01; 今天我想聊聊&#xff0c;如何通过Python自动化工具&#xff0c;解决工作中常见的办公效率低下的问题。 你有没有想过&#xff0c;下班晚&#xff0c;加班&#xff0c;可能是因为自己工作比较低效&#xff1f; 回…

wireshark 分析理解DHCP流程

DHCP概念&#xff1a; 动态主机配置协议 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;&#xff0c;是一个应用层协议。该协议允许服务器向客户端动态分配 IP 地址和配置信息。 知识补充&#xff1a; BOOTP&#xff08;Boots…

PVE使用cloud-init快速启动虚拟机

这里写目录标题关于cloud-init云镜像&#xff08;cloud image&#xff09;下载创建虚拟机模板&#xff0c;可反复使用DebianUbuntuCentOS使用模板关于cloud-init 传统ISO镜像装机时&#xff0c;需要一步一步规定虚拟机&#xff0c;比如系统盘安装在哪个磁盘里&#xff0c;ip是…

Vue Material - 基于谷歌 Material Design 打造的前端组件库,用 Vue 开发海外应用的绝佳选择

一位朋友问我用 vue 开发 APP 在谷歌商店上架&#xff0c;有什么简单的 UI 组件库&#xff0c;我推荐了这款&#xff0c;同样推荐给各位。 关于 Vue Material Vue Material 是一款简单、轻量级的 Vue 组件&#xff0c;组件的设计完全按照 Google Material Design 规范构建&am…

氟尿嘧啶/琥珀酰化壳聚糖偶联载药体(SUCS-5-FuOH)

氟尿嘧啶/琥珀酰化壳聚糖偶联载药体(SUCS-5-FuOH) 产品描述&#xff1a;以自制的琥珀酰化壳聚糖 (SUCS)和羟甲基-5-氟尿嘧啶(5-FuOH)为原料,制备了壳聚糖偶联载药体(SUCS-5-FuOH).结果表明,SUCS和5-FuOH间通过酯键化学键合,接枝率(载药率)为18.7%,在模拟体液和酶存在条件下均有…

Redis高可用全景一览

前言 前几天我在知乎看到一个问题&#xff1a;如何建立自己的知识体系和观点&#xff1f;[1] 在一篇高赞回答中讲述了建立“外脑”是关键&#xff0c;文章观点认为&#xff1a;大脑是用来思考的&#xff0c;不是用来记忆的。 我很认同这样的看法&#xff0c;我的账号名为“杨同…

电脑怎么滚动截图的方法

电脑截图常见的有矩形截图、任意形状截图、全屏幕截图、窗口截图等等&#xff0c;那你知道怎么在电脑上滚动截图吗&#xff1f;有时候可能会需要用到滚动截长图&#xff0c;但是很多 用户都不清楚怎么操作&#xff0c;下面小编就来教教大家电脑怎么滚动截图的方法&#xff08;除…

云存储--2

那么&#xff0c;根据我们上一版块的延续&#xff0c;我们来讲讲实际在linux中需要如何进行存储方面的一个操作吧。 那么我使用的是RHEL9.1 红帽作为在linux领域具有绝对的话语权和强大的市场&#xff0c;所以使用该系统还是有点原因哒~ 那么可能会有同学有疑问&#xff1a;欸&…

多目标遗传算法NSGAII求解环境经济调度(Python代码实现)

目录 1 电力系统环境经济调度数学模型 2 算例——IEEE10节点 2.1 数据​ 2.2 Python代码学习 3 一点拓展知识 1 电力系统环境经济调度数学模型 2 算例——IEEE10节点 2.1 数据 我弄成一个表格&#xff0c;方便编程读写&#xff1a; 2.2 Python代码学习 多目标遗传算法N…

【Flutter 组件】002-基础组件:文本与样式

【Flutter 组件】002-基础组件&#xff1a;文本与样式 文章目录【Flutter 组件】002-基础组件&#xff1a;文本与样式一、Text1、概述2、属性列表3、构造方法4、示例代码演示运行结果二、TextStyle1、概述2、属性列表3、构造方法4、示例代码示例运行结果三、TextSpan1、概述2、…

数字图像处理(入门篇)十 边缘检测

目录 一 边缘检测算子 1 Roberts算子 2 Sobel算子 3 Prewitt算子 二 实践 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;结果图 边缘检测是计算机视觉中的基本问题&#xff0c;边缘检测的难点就在于如何又快又准确地提取图像的边缘信息。 边缘检测的基本方法…

流媒体分析之webrtc之rtcp

TCP作为RTP控制协议&#xff0c;对于弱网下音视频质量和会话控制具有重要的作用。 1. RTCP Header V&#xff1a;RTCP的版本号&#xff0c;一定等于2&#xff1b; P&#xff1a;如果设置&#xff0c;填充位表示数据包包含末尾的附加填充八位字节&#xff0c;不属于控制信息&am…

基于jsp+mysql+ssm影视爱好者论坛交流系统-计算机毕业设计

项目介绍 设计一个电影学习交流社区&#xff0c;使对电影的学生可以方便的进行交流。同时&#xff0c;通过此课题使学生熟悉网站搭建流程和方法。 意义&#xff1a;此课题实现后&#xff0c;可以为喜欢电影的学生提供一个交流学习的平台&#xff0c;提高学生学习兴趣。同时&am…

想提前躺平的程序员,这10个网站收好了!

我们的口号是&#xff1a;搞钱&#xff01;搞钱&#xff01;再搞钱&#xff01;程序员想兼职但是不知道该上哪找&#xff1f; 为大家整理了7个程序员最常用的接私活平台&#xff0c;希望对你有帮助&#xff01;记得点赞收藏&#xff0c;先码后看&#xff01;1、程序员客栈 程序…

基于jsp+mysql+ssm游戏爱好者论坛交流设计-计算机毕业设计

项目介绍 本论坛是一个面向爱好游戏的玩家提供一个交流分享游戏攻略、视频、图片以及娱乐互动,让游戏玩家展示自己最真实的心声!论坛提供注册、登陆、发帖、回复、搜索等功能。用户可以利用论坛进行网上约伴、分享装备属性及其获得方法&#xff0c;进行账号交易等&#xff0c;…

5 - 线程池 Java内置的线程池 - 异步计算结果(Future)

前面介绍 ExecutorService 线程池接口的时候&#xff0c;其中&#xff0c;提交任务的方法 submit() 的返回值就是Future接口类型的。 我们刚刚在学习java内置线程池使用时&#xff0c;没有考虑线程计算的结果&#xff0c;但开发中&#xff0c;我们有时需要利用线程进行一些计算…

2022年牙科医疗行业研究报告

第一章 行业概况 1.1 牙科医疗概念及现状 牙科医疗行业是指以牙科医疗消费为基础&#xff0c;集合了牙科医疗服务、职业牙医教育培训、牙科医疗器材研究开发生产、市场策划、宣传、投资、经营、管理等于一体的医疗产业链。由于牙科疾病的特点&#xff0c;牙科医疗产业在具有一…

iOS扫码一图多码原生处理AVCaptureSession

文章目录前言正文1.定位二维码的位置2.扫码、解析总结前言 业务中一直有扫码的需求&#xff0c;这次说需要扫多个码&#xff08;详细一点是一图多码&#xff09;&#xff0c;有点东西的。 第一点&#xff1a;怎么做&#xff1a;拿到手第一反应是有没有什么库可以直接调用的&am…

VSCode远程连接免密登录

配置了VSCode远程连接服务器&#xff0c;但每次打开project都需要重新输入密码&#xff0c;比较麻烦&#xff0c;所以下面就介绍一下如何免密码登入 在上一篇blog里面配置好VSCode远程连接服务器之后按照如下操作。 步骤如下&#xff1a; 在windows端&#xff1a; 1、winR打…