1.3 双指针专题:快乐数(medium)

1.题目链接

202. 快乐数 - 力扣(LeetCode)https://leetcode.cn/problems/happy-number/submissions/609206400/

2.题目描述

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

「快乐数」 定义为:

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

⽰例 1:

  • 输⼊: n = 19
  • 输出: true

解释:

  • 19 -> 1 * 1 + 9 * 9 = 82
  • 82 -> 8 * 8 + 2 * 2 = 68
  • 68 -> 6 * 6 + 8 * 8 = 100
  • 100 -> 1 * 1 + 0 * 0 + 0 * 0 = 1

⽰例 2:

  • 输⼊: n = 2
  • 输出: false

解释:(这⾥省去计算过程,只列出转换后的数)

  • 2 -> 4 -> 16 -> 37 -> 58 -> 89 -> 145 -> 42 -> 20 -> 4 -> 16
  • 往后就不必再计算了,因为出现了重复的数字,最后结果肯定不会是 1


3.算法思路

该算法用于判断一个数是否为“快乐数”(即通过反复计算各位平方和最终能得到 1 的数)。其核心思想是 快慢指针法,通过高效检测循环避免无限迭代,具体步骤如下:


1. 计算平方和的辅助函数

  • 功能SunOfSquares(int n) 计算整数 n 每一位的平方和。

  • 实现

    • 通过循环取 n 的末位数字(n % 10),累加其平方值。

    • 移除末位(n /= 10),直到 n 变为 0。

  • 示例
    n = 19 → 1² + 9² = 1 + 81 = 82。


2. 快慢指针检测循环

  • 初始化

    • slow 初始化为 n(每次走一步)。

    • fast 初始化为 SunOfSquares(n)(每次走两步)。

  • 循环条件

    • slow != fast 时持续移动指针:

    • slow 移动一步:计算一次平方和。

    • fast 移动两步:连续计算两次平方和。

  • 终止条件:当 slow 和 fast 相遇时,说明存在循环或已到达 1。


3. 判断结果

  • 若相遇时 slow == 1,说明最终收敛到 1,是快乐数,返回 true

  • 若相遇时 slow != 1,说明进入非 1 的循环,返回 false


算法关键点

  • 快慢指针的优势
    无需额外存储空间(如哈希表),空间复杂度为 O(1)。快指针的速度是慢指针的两倍,确保在存在循环时快速相遇。

  • 数学依据
    根据弗洛伊德循环检测算法,快慢指针必然在环内相遇。若结果为 1,则后续所有平方和均为 1,形成“自环”。

  • 边界处理
    当输入为 1 时,直接跳过循环并返回 true,保证正确性。


示例分析

  • 输入n = 19

    • 过程:
      19 → 82 → 68 → 100 → 1

    • 快慢指针在 1 处相遇,返回 true

  • 输入n = 2

    • 过程:
      2 → 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4(进入循环)

    • 快慢指针在 4 处相遇,返回 false


复杂度

  • 时间复杂度O(n),其中 n 为到达循环或 1 的步数。快指针加速了循环检测。

  • 空间复杂度O(1),仅使用固定空间存储指针。


4.代码实现

class Solution 
{
public:// 定义函数 SumOfSquares 求 n 每一位数的平方和int SunOfSquares(int n){int sum = 0;while(n){int temp = n % 10;sum += temp * temp;n = n / 10;}return sum;}bool isHappy(int n) {int slow = n, fast = SunOfSquares(n);while(slow != fast){slow = SunOfSquares(slow);fast = SunOfSquares(SunOfSquares(fast));}return slow == 1;}
};

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

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

相关文章

系统结构知识点

1.主存和辅存以页面交换数据 2.计算机系统硬件固体软件 3.计算机系统结构概念的实质是确定计算机系统中软,硬件的界面,界面之上是软件实现的功能,界面之下是硬件和固体实现的功能 4.计算机组成是指计算机系统结构的逻辑实现。计算机实现是…

STM32 HAL库 CAN过滤器配置

之前在STM32 f407 CAN收发 基于HAL库和Cubemx配置_stm32f407can收发程序-CSDN博客这篇博文里写了一下配置CAN收发的方法,当时由于并没有使用过滤器的现实需求,所以就也没仔细研究。现在工作中确实需要用到过滤器了,有些项目中控制器和发动机E…

飞搭系列|数据迁移功能全新升级,助力用户实现高效无缝迁移!

前言 飞搭低代码平台(FeiDa,以下简称“飞搭”),为企业提供在线化、灵活的业务应用构建工具,支持高低代码融合,助力企业低门槛、高效率和低成本地快速应对市场变化,加速复杂业务场景落地。 在之…

【后端】【ubuntu】 ubuntu目录权限查看的几种方法

在Ubuntu中,有多种方式可以查看目录或文件的权限,以下为你详细介绍常见的指令及其使用方法: 1. ls -l 命令 这是最常用的查看文件和目录权限的命令,-l 选项用于以长格式列出文件和目录的详细信息,其中就包含权限信息…

深度学习与大模型基础-向量

大家好!今天我们来聊聊向量(Vector)。别被这个词吓到,其实向量在我们的生活中无处不在,只是我们没注意罢了。 1. 向量是什么? 简单来说,向量就是有大小和方向的量。比如你从家走到学校&#x…

TCP/IP原理详细解析

前言 TCP/IP是一种面向连接,可靠的传输,传输数据大小无限制的。通常情况下,系统与系统之间的http连接需要三次握手和四次挥手,这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…

用Python和Docker-py打造高效容器化应用管理利器

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着容器化技术的发展,Docker已成为现代化应用部署的核心工具。然而,手动管理容器在规模化场景下效率低下。本文深入探讨如何利用Python结…

【RabbitMQ】事务

事务的简单配置及使用 配置事务管理器声明队列生产者代码测试 RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,因此RabbitMQ也支持事务机制. SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的&#xff0c…

在 IntelliJ IDEA 中配置 Git

1. 确保已安装 Git 在配置之前,确保你的系统已经安装了 Git。 检查是否已安装 Git: bash 复制 git --version 如果未安装,请前往 Git 官网 下载并安装。 2. 在 IntelliJ IDEA 中配置 Git 打开 IntelliJ IDEA。 进入设置: Windo…

【A2DP】蓝牙A2DP协议剖析:从架构到规范

目录 一、A2DP 协议架构 1.1 A2DP 协议栈结构组成 1.2 协议栈各部分的关系与作用 二、设备配置与角色定义(Configurations and roles ) 2.1 角色定义 2.2 配置示例与角色体现 三、用户需求与场景 3.1 用户需求与场景 3.2 协议限制 3.3 协议要求…

【从零开始学习计算机科学】操作系统(五)处理器调度

【从零开始学习计算机科学】操作系统(五)处理器调度 处理器调度一些简单的短程调度算法的思路先来先服务(First-Come-First-Served,FCFS)优先级调度及其变种最短作业优先调度算法(SJF)--非抢占式最短作业优先调度算法(SJF)--抢占式最高响应比优先调度算法轮转调度算法…

27. Harmonyos Next仿uv-ui 组件NumberBox 步进器组件禁用状态

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! 文章目录 1. 组件介绍2. 效果展示3. 禁用状态设置3.1 整体禁用3.2 输入框禁用3.3 长按禁用 4. 完整示例代码5. 知识点讲解5.1 禁用状态属性5.2 禁用…

Shardingsphere-jdbc 自定义脱敏规则

添加邮件脱敏规则: // 123123123qq.com,将前4个字符脱敏 12312****qq.com 代码重写MaskAlgorithm相关方法: /** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements. See the NOTICE…

大模型在甲状腺良性肿瘤诊疗全流程中的应用研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义与价值 二、甲状腺良性肿瘤概述 2.1 疾病介绍 2.2 流行病学特征 2.3 传统诊疗方法综述 三、大模型技术原理及应用优势 3.1 大模型技术简介 3.2 在医疗领域的应用进展 3.3 针对甲状腺良性肿瘤的应用优势 四、大模型在…

软件IIC和硬件IIC的主要区别,用标准库举例!

学习交流792125321,欢迎一起加入讨论! 在学习iic的时候,我们经常会遇到软件 IC和硬件 IC,它两到底有什么区别呢? 软件 IC(模拟 IC)和硬件 IC(外设 IC)是两种实现 IC 总线通信的方式…

店匠科技携手 PayPal 升级支付体验,助力独立站商家实现全球增长

在全球化电商竞争加剧的背景下,独立站为无数商户插上了通向事业成功的翅膀。然而,搭建店铺框架容易,真正实现有效运营却充满挑战。只有当各个环节如齿轮般严丝合缝,独立站运营才能更好地助推行进,实现稳健增长。如今,独立站商家面临着全链路运营的多重挑战。从品牌塑造、营销推…

密码学 网络安全 科普 网络安全密码技术

网络加密包括密码技术和网络加密方法两个方面。 一、 密码技术   密码技术一般分为常规密码和公钥密码。   常规密码是指收信方和发信方使用相同的密钥,即加密密钥和解密密钥是相同或等价的。比较著名的常规密码算法有DES及其各种变形、IDEA、FEAL、Skipjack…

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 or Set--lower_bound()的解法!!!

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 题目 并查集解析代码【并查集解】 Set 解法解析lower_bound代码 题目 并查集解析 首先先让所有的f(i)i,即每个人最开始的祖先都是自己,然后就每一次都让轮到那个数的父亲1&#xff08…

Anaconda中虚拟环境安装g++和gcc相同版本

安装torchSDF的时候遇到的,这是g和gcc版本不一致的问题 gcc: fatal error: cannot execute cc1plus: execvp: No such file or directory compilation terminated.查看gcc, g版本 gcc --version | head -n1 g --version | head -n1发现gcc的是anaconda中的&#x…

C++编程:进阶阶段—4.2对象

目录 4.2 对象特征 4.2.1 构造函数和析构函数 4.2.2 构造函数的分类 4.2.3 拷贝函数调用时机 4.2.4 构造函数调用规则 4.2.5 深拷贝与浅拷贝 4.2.6 初始化列表 4.2.7 类对象作为类成员 4.2.8 静态成员 4.2.9 成员变量和成员函数的存储 4.2.10 this指针 4.2.11 空指针…