Leetcode202. 快乐数

news2025/1/10 20:31:05

Every day a leetcode

题目来源:202. 快乐数

解法1:hash

根据几个例子,我们发现只有2种结果:

  1. 最终会得到1
  2. 最终进入一个循环

其实得到1后,继续计算(将该数替换为它每个位置上的数字的平方和)也是得到1,相当于进入1的循环。

由此可以看出,计算结果一定得到一个循环。

一个数是否是快乐数,取决于循环的入口是不是1。

我们使用STL容器unordered_map作为哈希表。

代码:

/*
 * @lc app=leetcode.cn id=202 lang=cpp
 *
 * [202] 快乐数
 */

// @lc code=start
class Solution
{
public:
    int getNext(int n)
    {
        int sum = 0;
        while (n > 0)
        {
            int x = n % 10;
            sum += x * x;
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n)
    {
        unordered_map<int, bool> umap;
        while (n != 1 && umap.find(n) == umap.end())
        {
            umap.insert(pair<int, bool>(n, true));
            n = getNext(n);
        }
        return n == 1;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

在这里插入图片描述

解法2:快慢指针

通过反复调用getNext(n)得到的链是一个隐式的链表。隐式意味着我们没有实际的链表节点和指针,但数据仍然形成链表结构。起始数字是链表的头 “节点”,链中的所有其他数字都是节点。next指针是通过调用 getNext(n) 函数获得。

意识到我们实际有个链表,那么这个问题就可以转换为检测一个链表是否有环。因此我们在这里可以使用弗洛伊德循环查找算法。这个算法是两个奔跑选手,一个跑的快,一个跑得慢。在龟兔赛跑的寓言中,跑的慢的称为 “乌龟”,跑得快的称为 “兔子”。

不管乌龟和兔子在循环中从哪里开始,它们最终都会相遇。这是因为兔子每走一步就向乌龟靠近一个节点(在它们的移动方向上)。

在这里插入图片描述

使用 “快慢指针” 思想,找出循环:“快指针” 每次走两步,“慢指针” 每次走一步,当二者相等时,即为一个循环周期。此时,判断是不是因为 1 引起的循环,是的话就是快乐数,否则不是快乐数。

注意:此题不建议用集合记录每次的计算结果来判断是否进入循环,因为这个集合可能大到无法存储;另外,也不建议使用递归,同理,如果递归层次较深,会直接导致调用栈崩溃。不要因为这个题目给出的整数是 int 型而投机取巧。

初始化快指针fast为n,慢指针slow为n。

fast = getNext(getNext(fast));
slow = getNext(slow);

最后判断fast是否为1。

代码:

class Solution
{
public:
    int getNext(int n)
    {
        int sum = 0;
        while (n > 0)
        {
            int x = n % 10;
            sum += x * x;
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n)
    {
        int fast = n, slow = n;
        do
        {
            fast = getNext(getNext(fast));
            slow = getNext(slow);
        } while (fast != slow);
        return fast == 1;
    }
};

结果:

在这里插入图片描述

复杂度分析:

在这里插入图片描述

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

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

相关文章

美妆“数字员工”来了!丸美:每月节省30人日!提升员工幸福感,企业效益稳增

美妆&#xff0c;因其效果可视觉化呈现的特征&#xff0c;决定了美妆品牌与直播带货的高匹配度。流量&#xff0c;是直播商家深入了解粉丝参与情况和商品销售状况的重要依据。因此&#xff0c;美妆商家需要每天下载直播数据报表&#xff0c;监测流量、成交变化趋势&#xff0c;…

数据可视化 —— 小练习1 KMeans聚类并数据可视化图像像素点

数据可视化Task1 任务描述&#xff1a;对图片RGB点进行Kmeans聚类&#xff0c;并将结果数据可视化于前端浏览器上 实验平台&#xff1a; Visual Studio CodeHTML/CSS/JavascriptEdge/Chorme/Firefox 浏览器Echart.min.js 3.8.5版 &#xff08;过高的版本浏览器无法include&a…

Python采集豆Top250电影数据 , 看看质量及评分

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 本次案例涉及点: 1、动态数据抓包演示 2、csv文件保存 3、requests模块的使用 4、parsel解析数据的使用 环境介绍&#xff1a; 软件安装 python 3.8 pycharm 不会安装的可以文末名片我获取哦 &#x1f60e; 模块使用…

windows安装flutter

在flutter官网下载flutter 在 Windows 操作系统上安装和配置 Flutter 开发环境 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 下载文件后&#xff0c;解压文件把文件存放在指定位置 打开flutter_console.bat文件 输入flutter doctor flutter报错提示&#xff08;…

unity-VRTK学习日记1(VRTK4|无头盔开发模拟器SpatialSimulator)

目录 前言 前期准备 1.配置VRTK4&#xff1a; 2.把几个插件给安装好 查看自己安装了哪些VRTK插件 3.添加模拟器 操作方法 操作方法&#xff1a;人话 前言 VRTK的较早版本不适用于Unity的新版本&#xff0c;原因好像是Unity将VR开发功能并入到自家的XR下了。就是之前更新…

即时通讯独立系统源码包含Android 、iOS、PC

demo软件园每日更新资源,请看到最后就能获取你想要的: 1.经典版哇呼星聊即时通讯独立系统源码 包含Android 、iOS、PC 自带教程 哇呼星聊即时通讯系统源码 AndroidiOSPC三端 附教程 服务器最低配置4H4G 这套安装跟shiku一样 1.安装宝塔&#xff0c;只安装Nginx&#xff0c;其他…

力扣,合并石头最低成本算法题

1&#xff1a;这个题有题解&#xff0c;自己可以去看力扣&#xff0c;合并石头 2&#xff1a;网上也有视频自己去看视频讲解 3&#xff1a;下面我自己的一些理解 4&#xff1a;原需求&#xff1a; 5&#xff1a;代码&#xff1a;使用贪心算法和最小堆来求解&#xff1a; im…

FreeRTOS系统学习-内核篇.01-数据结构---列表与列表项定义详解-链表节点插入实验

# 内核篇.01 列表与列表项 为什么要学列表&#xff1f;链表单向链表双向链表 FreeRTOS 中链表的实现节点节点初始化尾节点根节点链表根节点初始化将节点插入到链表的尾部将节点按照升序排列插入到链表将节点从链表删除节点带参宏小函数 链表节点插入实验实验现象 为什么要学列表…

TPM-TPM-Profile-PTP协议-2

TCG_PCClient_Device_Driver_Design_Principles_TPM2p0_v1p1_r4_211104_final.pdf 4 简介 本文档补充了 TCG PC Client Platform TPM Profile for TPM 2.0 Specification [PTP]&#xff1b; 特别是&#xff0c;本文档为有兴趣开发 DD 的 DD 编写者提供指导&#xff0c;以便与旨…

【C++】带你先入门类和对象(上)

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录 前言一、面向过程和面向对象初步认识二、类的引入三、类的定义四.类的访问限…

java后端为前端提供接口,将数据以树形结构返回(工具类hutool.core.lang.tree)

用于后端java的实用、简洁、通俗易懂的树形工具类使用笔记 设计需求是做一个类似于部门管理的树形结构&#xff0c;后端设计表写逻辑&#xff0c;为前端提供接口&#xff0c;将数据以树形结构返回 这里直接上代码&#xff0c;基本可以直接拿去用&#xff0c;把父id和名称做对…

Oracle之可视化ETL任务调度设计接口实现方案

背景 以前的项目有这么一个需求,线上的任务需要灵活的可视化配置,而一般的ETL任务调度需要写JOB的SQL脚本(需要对Oracle的dbms_job比较熟悉),而维护成本比较高,虽然可以查看执行的信息,但是权限比较高,不利于项目后台数据的安全。所以通过需求背景,自研设计任务调度平…

小程序按钮重复点击解决方案

文章目录 前言一、为什么会发生重复点击二、针对以上问题怎么处理1、分析解决方法&#xff1a;1. 反馈2.禁用 三、最优解决总结 前言 小程序是直面用户便捷的应用&#xff0c;而在用户使用时往往都会涉及到关键节点的按钮点击&#xff0c;例如&#xff0c;注册登录时&#xff…

服务百万商家的系统,发布风险如何规避?微盟全链路灰度实践

一分钟精华速览 全链路灰度发布是指在微服务体系架构中&#xff0c;应用的新、旧版本间平滑过渡的一种发布方式。由于微服务之间依赖关系错综复杂&#xff0c;一次发布可能会涉及多个服务升级&#xff0c;所以在发布前进行小规模的生产环境验证&#xff0c;让新版本的应用实例…

锂电材料浆料匀浆搅拌设备轴承经常故障如何处理?

锂电材料浆料匀浆搅拌设备是锂电池生产中重要的设备之一&#xff0c;用于将活性材料、导电剂、粘结剂和溶剂混合成均匀的浆料&#xff0c;是电极制备过程中不可或缺的步骤。然而&#xff0c;由于高速搅拌和化学腐蚀等因素的影响&#xff0c;轴承经常会出现故障&#xff0c;导致…

Java基础部分面试题(2023最新)

一、Java概述 1. 谈谈你对 Java 平台的理解&#xff1f; ① 平台无关性&#xff08;一次编译到处运行&#xff09; ② GC&#xff08;垃圾自动回收机制&#xff0c;不像C那样需要手动去释放堆内存&#xff09; ③ 语言特性&#xff08;泛型、反射、Lambda 表达式&#xff09; …

Dubbo 简易环境搭建以及使用(2)

目录 环境搭建 Dubbo的3种使用方式&#xff1a; 1. XML配置的方式&#xff0c;一般用于Spring MVC工程 2. 配置文件的方式 &#xff08;spring boot工程&#xff09; 3. 注解方式 Dubbo 控制台 环境搭建 本篇将介绍Spring boot zookeeper Dubbo 简易环境的搭建以及使用…

同等学力申硕如何择校?

我们常常会在一些艰难选择面前不知所措&#xff0c;比如说不知道选择什么样的院校学习&#xff0c;不知道选择什么样的专业学习&#xff0c;不知道同等学力申硕的具体过程&#xff0c;不知道这个过程中你要付出多大的代价&#xff0c;更不知道学习中的一些关键环节等&#xff0…

飞利浦水健康携净水新品重磅亮相AWE2023

2023年度中国家电及消费电子博览会&#xff08;AWE2023&#xff09;于4月27日在上海新国际博览中心正式开幕。其中&#xff0c;飞利浦水健康携全屋高阶净水G5系列、厨下净水器U22Pro、冰热矿净四合一台式净饮机等新品悉数亮相&#xff0c;在暌违2年的AWE舞台上&#xff0c;为行…

垃圾分类算法训练及部署

垃圾分类算法训练及部署 创建模型与编译模型训练及保存模型生成模型应用 创建模型与编译 数据加载进模型后定义模型结构&#xff0c;并优化损失函数。直接调用VGG-16模型作为卷积神经网络&#xff0c;包括13个卷积层、3个全连接层、5个池化层&#xff0c;后接全连接层&#xf…