leetcode面试经典150题——50 快乐数

题目:快乐数

描述:
编写一个算法来判断一个数 n 是不是快乐数。
快乐数」 定义为:

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

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
leetcode链接

方法一:哈希表
由题目可知我们判断一个数字是不是快乐数,通过不断循环模拟,最后判断该数字是不是等于1,我们发现如果这个数字是快乐数,那么只需要对其进行简单的模拟即可,但是如果不是快乐数的情况呢?
对于不是快乐数的数字,我们可以分两种情况:
1.一直循环,但是不等于1
2.不循环,并且越来越大
对于第一种情况,我们可以利用哈希表来进行判断循环的操作,如果数字出现了重复,那么就是发生了循环,返回false
而对于第二种情况,我们发现对于不同位数的数字,其各位平方相加之和的最大值如下图所示:
在这里插入图片描述
以此类推,我们发现从三位数开始往后,其各位平方相加之和不可能大于这个数,所以我们对于任意一个数字,最后都不会变得无穷大,因此不存在出现第二种情况,所以对于一个不是快乐数的数字,一定会出现循环。而我们 跳出循环的方法可以利用哈希表来进行操作。
时间复杂度:o(logn) 一个值为n的数的位数为logn,因此我们查找下一个给数的时间为o(logn)
空间复杂度:o(1)

bool isHappy(int n) {
    unordered_set<int> set;
    while(n!=1&&!set.count(n)){//当n不等于1并且没有陷入循环的时候继续while循环
        set.insert(n);
        int sum = 0;
        while(n>0){
            int digit = n%10;
            sum+=digit*digit;
            n/=10;
        }
        n = sum;//更新n
    }
    return n==1;
}

方法二:快慢指针
同样的,我们出来可以利用哈希表来判断循环,还可以用快慢指针来判断循环,因为在一个循环中,快指针一定会追上慢指针,所以当我们快指针追上了慢指针时,就证明出现了循环,返回false,当没有循环的时候,快指针会比慢指针更加快的达到1,因此我们while循环的结束条件为快指针追上了慢指针或者快指针达到了1.
时间复杂度:o(logn) 同样的查找下一个数的时间为logn
空间复杂度:o(1)

bool isHappy(int n) {
    int slow = n,fast = n;
    do{
        fast = getNext(getNext(fast));//快指针一次前进2格
        slow = getNext(slow);//慢指针一次前进1格
    }while(fast!=slow&&fast!=1);
    return fast==1;
}
//求数字n的下一个数字
int getNext(int n){
    int sum = 0;
    while(n>0){
        int digit = n%10;
        sum+=digit*digit;
        n/=10;
    }
    return sum;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaWeb学习笔记】19 - 网购家居项目开发(上)

一、项目开发流程 程序框架图 项目具体分层方案 MVC 1、说明是MVC MVC全称: Mode模型、View视图、Controller控制器。 MVC最早出现在JavaEE三层中的Web层&#xff0c;它可以有效的指导WEB层的代码如何有效分离&#xff0c;单独工作。 View视图:只负责数据和界面的显示&…

CSS 选择器全攻略:从入门到精通(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Linux---gcc编译

目录 前言 一、gcc编译 二、程序的编译过程 三、gcc查看编译过程 1.预处理阶段 2.编译 3.汇编 4.链接 动静态库链接的内容 动静态库链接的优缺点 5.总结记忆 前言 在前面我们学会使用vim对文件进行编辑&#xff0c;如果是C或者C程序&#xff0c;我们编辑好了内容…

【Xilinx FPGA】异步 FIFO 的复位

FIFO&#xff08;First-In-First-Out&#xff0c;先入先出&#xff09;是一种的存储器类型&#xff0c;在 FPGA 开发中通常用于数据缓存、位宽转换或者跨时钟域&#xff08;多 bit 数据流&#xff09;。在使用异步 FIFO 时&#xff0c;应注意复位信号是否遵循相关要求和规范&am…

RediSearch vs. Elasticsearch vs. solr

1. RediSearch vs. Elasticsearch RediSearch是一个分布式全文搜索和聚合引擎&#xff0c;作为Redis之上的一个模块构建。它使用户能够以极快的方式在Redis数据集上执行复杂的搜索查询。RediSearch的独特架构是用C编写的&#xff0c;从头开始构建在优化的数据结构上&#xff0…

行为型模式 | 观察者模式

一、观察者模式 1、原理 观察者模式又叫做发布-订阅&#xff08;Publish/Subscribe&#xff09;模式&#xff0c;定义了一种一对多的依赖关系。让多个观察者对象同时监听某一个主题对象&#xff0c;这个主题对象在状态上发生变化时&#xff0c;会通知所有观察者对象&#xff0…

计算机网络 - 路由器查表过程模拟 C++(2024)

1.题目描述 参考计算机网络教材 140 页 4.3 节内容&#xff0c;编程模拟路由器查找路由表的过程&#xff0c;用&#xff08;目的地址 掩码 下一跳&#xff09; 的 IP 路由表以及目的地址作为输入&#xff0c;为目的地址查找路由表&#xff0c;找出正确的下一跳并输出结果。 1.…

MFC为对话框资源添加类

VC6新建一个对话框类型的工程; 建立之后资源中默认有2个对话框,一个是主对话框,About这个是默认建立的关于版权信息的; 然后主对话框有对应的.h和.cpp文件;可以在其中进行编程; 默认建立的有一个 关于 对话框; 在资源中新插入一个对话框,IDD_DIALOG1是对话框ID; 新加…

软件测试理论----测试设计方法论

1、测试用例格式 &#xff08;1&#xff09;用例编号&#xff1a;用例的唯一标识&#xff0c;要求具有易识别性和易维护性&#xff0c;能能够根据用例编号识别用例的目的和作用&#xff0c;一般格式为&#xff1a;A-B-C-D 其中 A&#xff1a;一般表示产品或者项目名称B&#…

android 9 reboot流程

机器出现开机 自动进入fastboot模式。可能是init 那个进程挂了 然后调用了 RebootSystem(ANDROID_RB_RESTART2, “bootloader”); 函数进入重启流程&#xff0c;然后重启后进入fastboot 浅读一下reboot流程和怎么进入的fastboot 比如说是那个进程挂了调用了这个函数&#xff0c…

SpringBoot默认配置文件

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot默认配置文件 📚个人知识库: Leo知识库,欢迎大家访问 1.前言☕…

CSS3中transform2D变形详解

CSS3变形 在CSS3中&#xff0c;动画效果包括3个部分&#xff1a; 变形(transform)过渡(transition)动画(animation) 在实际开发中&#xff0c;有时需要实现元素的各种变形效果&#xff0c;如平移&#xff0c;缩放&#xff0c;旋转&#xff0c;倾斜等。 在CSS3中&#xff0c…

APP备案流程

一、 APP备案是指 自2000年起&#xff0c;依据《互联网信息服务管理办法》(国务院令第292号)规定&#xff0c;电信主管部门对从事互联网信息服务的网站开展备案核准工作(即ICP备案)。经过20多年的持续优化完善&#xff0c;已形成“电信主管部门-网络接入服务提供者-互联网信息…

数据结构之排序二叉树

排序二叉树 基本概念 二叉树是一种从上往下的树状结构的数据结构&#xff0c;从根节点开始每个节点最多有两个子节点&#xff0c;左边的为左子节点&#xff0c;右边的为右子节点。 排序二叉树–有顺序&#xff0c;且没有重复元素的二叉树。顺序为&#xff1a; 对每个节点而…

APP流量变现——4项关键指标决定了APP混合变现的收入

APP流量变现的方式有很多种&#xff0c;主要的可以分为IAA&#xff08;广告&#xff09;收入、IAP&#xff08;用户应用内付费&#xff09;收入、订阅收入、单次买断收入。这里主要围绕当前流行的混合变现模式&#xff0c;即广告收入&#xff08;IAA&#xff09;应用内付费&…

探索 hasOwnProperty:处理对象属性的关键(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

spring cloud之集成sentinel

写在前面 源码 。 本文一起看下spring cloud的sentinel组件的使用。 1&#xff1a;准备 1.1&#xff1a;理论 对于一个系统来说&#xff0c;最重要的就是高可用&#xff0c;那么如何实现高可用呢&#xff1f;你可能会说&#xff0c;集群部署不就可以了&#xff0c;但事实并…

window11后台服务优化记录

这里:\WINDOWS\xxx\svchost.exe -k netsvcs -p 信号聚合器服务&#xff0c;用于根据时间、网络、地理位置、蓝牙和 CDF 因素评估信号。支持的功能包括设备解锁、动态锁定和动态 MDM 策略 参考&#xff1a; 优化参考v1

数字化发展助力青少年阅读回归“慢节奏”

近日&#xff0c;《2024年学前及中小学生寒假分年级阅读推荐书目》发布&#xff0c;正尝试引领青少年阅读在短视频时代回归“慢节奏”。该推荐书目针对每个学龄孩子的学习特点、认知特点、心理特点进行推荐&#xff0c;旨在培养孩子的深度思考能力。 在数字化时代&#xff0c;…

Docker的介绍及安装基本操作命令

前言 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱…