力扣算法-Day14

news2025/1/15 23:44:45

第202题. 快乐数

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

「快乐数」 定义为:

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

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

思路:

递归:终止条件——n = 1的时候返回true,n = 4 的时候返回false。10以内的数字只有4是不断的循环的。
哈希表:

  • 先理解题目要求,这道题的要点一共有两个:
    1. 做完某次计算后等于 1,return true,不必多说。
    2. 在计算的过程中无限循环始终不变为 1,也就是说,它的计算结果 sum 会重复出现,这是本题的关键,若在循环的过程中 sum 重复出现,说明它永远不可能等于 1,return false
  • 理解了以上两点再来看就比较简单了,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。在本题中,使用数组作为哈希表用来存放每次计算的结果,初始数组都为 0,每次计算后将结果作为下标映射到数组元素。若对应数组元素为 0,说明此结果没得到过,将其改为 1;若为 1,说明计算结果已经重复,return false
  • 那么数组的大小怎么确定呢?题目中告诉了 n 的大小最大不超过 2^31-1,即最大不超过 10 位数,也就是说,计算的结果最大不超过 9^2*10 也就是 810,再稍微大一点就行了,所以是820,这也是为什么本题能用数组的原因,否则只能递归或者手搓set(下一期会出)。
  • 注意,使用数组来做哈希的题目,是因为题目都限制了数值的大小。而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。

双指针:快慢指针

初始化:慢指针、快指针都为 n 。慢指针每次走一步,快指针每次走两步。如果遇到无限循环的数字,这两个指针一定会相遇。这个时候,相遇的时候快慢指针如果指到的数字为1。这个时候循环结束,返回 true(这个时候慢指针走完一轮、快指针一直为1)。否则返回 false。
这里所说的向前走一步是 “对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和”这个意思。

 递归:

bool isHappy(int n) {
    if (n == 1) {
        return true;
    }
    if (n == 4) {
        return false;
    }
    int sum = 0;
    while (n>0) {
        sum += (n % 10)*(n % 10);
        n /= 10;
    }
    return isHappy(sum);
}

哈希表:

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

bool isHappy(int n){
    int sum = getSum(n);
    int hash[820] = {0};

    while (sum != 1) {
        if (hash[sum] == 1) {
            return false;
        } else {
            hash[sum]++;
        }
        sum = getSum(sum);
    }
    return true;
}

双指针:

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

bool isHappy(int n) {
    int slow = n;
    int fast = n;

    do {
        slow = get_sum(slow);
        fast = get_sum(get_sum(fast));
    } while (slow != fast);

    return (fast == 1);
}

总结:

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。

这一期专栏记录将我每天的刷题,希望各位的监督,也希望和各位共勉。

追光的人,终会光芒万丈!!

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

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

相关文章

每日一题--------求数字的每⼀位之和

大家好今天的每日一题又来了,有啥不对的请在评论区留言哦 文章目录 目录 文章目录 求数字的每⼀位之和 题⽬描述: 输⼊⼀个整数m,求这个整数m的每⼀位之和,并打印。 一、解题思路 我们可以通过不断获取该整数的个位数&#xff0c…

Github项目推荐:KaTeX

项目地址 GitHub - KaTeX/KaTeX: Fast math typesetting for the web. 项目描述 这是一个渲染公式的JavaScript库。有时候可能网页中需要写一些公式,但html本身并没有提供相应的标签。这个时候这个库就能派上用场了。 项目截图

centos7安装nginx并安装部署前端

目录: 一、安装nginx第一种方式(外网)第二种方式(内网) 二、配置前端项目三、Nginx相关命令 好久不用再次使用生疏,这次记录一下 一、安装nginx 第一种方式(外网) 1、下载nginx ng…

【DDD领域驱动篇】如何理解领域驱动设计?

如何理解领域驱动设计? ✔️典型解析✔️扩展知识仓库✔️DDD带来的好处✔️DDD 的不足 ✔️典型解析 领域动设计(Domain-Driven Design,DDD)是一种软件开发方法论,将业务领域作为软件设计的核心,以便更好地满足业务需求。 DDD认为&#xff…

CodeWhisperer——轻松使用一个超级强大的工具

CodeWhisperer 简介 CodeWhisperer是亚⻢逊云科技出品的一款基于机器学习的通用代码生成器,可实时提供代码建议。 CodeWhisperer有以下几个主要用途: 解决编程问题,提供代码建议,学习编程知识等等,并且CodeWhisper…

什么是https证书?

HTTPS证书,也称为SSL(Secure Sockets Layer)证书或TLS(Transport Layer Security)证书,是一种数字证书,用于在网络上建立安全的加密连接。它的主要目的是确保在互联网上进行的数据传输的安全性和…

12.18构建哈夫曼树(优先队列),图的存储方式,一些细节(auto,pair用法,结构体指针)

为结构体自身时,用.调用成员变量;为结构体指针时,用->调用成员变量 所以存在结构体数组时,调用数组元素里的成员变量,就是要用. 结构体自身只有在new时才会创建出来,而其指针可以随意创建 在用new时&…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第六节 理解垃圾回收GC,提搞程序性能

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第六节 理解垃圾回收GC,提搞程序性能 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基…

Ubuntu fcitx Install

ubuntu经常出现键盘失灵的问题 查询资料得知应该是Ibus框架的问题 于是需要安装fcitx框架和搜狗拼音 sudo apt update sudo apt install fcitx 设置fcitx开机自启动(建议) sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/ 然后…

2024-软件测试工程师面试题,面试前一天刷效果更佳。

bug的定义,bug的周期 软件bug是指软件程序的漏洞和缺陷,测试工程师或用户所发现和提出的软件可改进的细节、或与需求文档存在差异的功能实现等生命周期中缺陷状态:新建-->指派-->已解决-->待验-->关闭 发现BUG-->提交BUG--&g…

案例260:基于微信小程序的签到系统的设计与实现

文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder …

重磅发布|博睿数据2023年度精选案例集—— IT运维之光

当前,数字经济已经成为全球经济增长的重要引擎。随着新技术的飞速发展,企业数字化转型机遇不断涌现,而稳定、安全、可靠的IT运维环境是实现数字化转型的关键。 在此背景下,AIOps 智能运维正成为企业高效管控种类繁多数量庞大的物…

听说!Art-DAQ实现了与LabVIEW的无缝连接

前言 阿尔泰科技与时俱进,推出Art-DAQ程序,与LabVIEW无缝连接,形成系统平台体系。持续不断地获取行业新技术,完善自主知识产权产品的研发,为客户提供优质服务。 什么是Labview? 从产品的角度来看&#x…

电话号码的字母组合[中等]

一、题目 给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。 示例 1: 输入:digits "23" 输出&am…

java itext5 生成PDF并填充数据导出

java itext5 生成PDF并填充数据导出 依赖**文本勾选框****页眉**&#xff0c;**页脚****图片**实际图 主要功能有文本勾选框&#xff0c;页眉&#xff0c;页脚&#xff0c;图片等功能。肯定没有专业软件画的好看&#xff0c;只是一点儿方法。仅供参考。 依赖 <!--pdf-->&…

CAS-手写自旋锁

CAS与自旋锁&#xff0c;借鉴CAS思想 什么是自旋锁&#xff1f; CAS是实现自旋锁的基础&#xff0c;CAS利用CPU指令保证了操作的原子性&#xff0c;以达到锁的效果&#xff0c;至于自旋 锁---字面意思自己旋转。是指尝试获取锁的线程不会立即阻塞&#xff0c;而是采用循环的…

【头歌实训】kafka-入门篇

文章目录 第1关&#xff1a;kafka - 初体验任务描述相关知识Kafka 简述Kafka 应用场景Kafka 架构组件kafka 常用命令 编程要求测试说明答案代码 第2关&#xff1a;生产者 &#xff08;Producer &#xff09; - 简单模式任务描述相关知识Producer 简单模式Producer 的开发步骤Ka…

庙算兵棋推演AI开发初探(2-编写策略(上))

开始研读step()函数的编写方法。 这个是图灵网提供了一些基础的ai代码下载&#xff08;浏览需要注册&#xff0c;下载需要审批&#xff09;。 AI开发中心-人机对抗智能 (ia.ac.cn)http://turingai.ia.ac.cn/ai_center/show 一、代码研读(BaseAgent类) 1.step函数 这段代码定…

快速上手makefile自动化构建工具

makefile自动化构建工具 文章目录 makefile自动化构建工具 makefile背景 简单认识makefile 依赖关系与依赖方法 生成项目 清理项目 ACM时间 语法补充 .PHONY修饰 特殊符号替换 Makefile的推导过程 总结 前言&#xff1a; 在windows下&#xff0c;很多东西都是编译器直接帮你做…

Java EasyExcel 导入代码

Java EasyExcel 导入代码 导入方法 /*** 仓库库位导入** param req* param res* param files* throws Exception*/RequestMapping(value {"/import/line_store_locs"}, method {RequestMethod.POST})ResponseBodypublic void importStoreLoc(HttpServletRequest …