3.LeetCode算法习题讲解--双指针--快乐数

一.题目

习题链接:202. 快乐数 - 力扣(LeetCode)

二.题目分析

给定正整数 n,循环执行操作: 把数字每一位拆开,求每位数字的平方相加,得到新数字;

  1. 若某一步结果等于 1 → 该数是快乐数,返回 true;
  2. 若过程进入循环、永远到不了 1 → 不是快乐数,返回 false。

三.算法原理讲解

通过上述分析,我们可以看出,最后都会进入循环

示例一:最终会进入全为1的循环;

示例二:最终会进入几个数的循环

所以这里我们联想到链表当中带环问题,那里我们定义了两个指针,一个快指针,一个慢指针,这里也是同样如此,但是我们这里的快慢指针并不是我们之前那样想的,是一个新的思想

思路: 定义一个慢指针指向第一个**数字(本题指向的是数字)**每次计算一次平方和

快指针也指向第一个数字,每次计算两次平方和,最后两个指针会相遇,如果相遇就判断相遇点是否是1

四.编写代码

注意:按我这种写法这里只能用do...while循环,因为刚开始定义的是让快慢指针相等,如果用while就不会进入循环,用do...while想让它们走然后再判断

cpp 复制代码
class Solution {
public:
    int num(int cycle)
    {
        int num = 0;
        while(cycle)
        {
            int bit = cycle %10;
            num += bit * bit;
            cycle = cycle / 10;
        }
      
        return num;
    }
    bool isHappy(int n) {
        int slow = n;
        int fast = n;
        do
        {
            slow = num(slow);
            fast = num(fast);
            fast = num(fast);
        }while(slow != fast);
        return slow == 1;
    }
};
相关推荐
aqiu1111111 小时前
【C++算法打怪专栏】8. 字符串转换整数 (atoi)
开发语言·c++·算法
信奥卷王9 小时前
[GESP202609 六级] 分树规划
算法
夏幻灵9 小时前
LeetCode 21:合并两个有序链表——双指针与哑节点详解
算法·leetcode·链表
徐小黑ACG11 小时前
Golang 基础05 结构体struct
开发语言·算法·golang
Navigator_Z11 小时前
LeetCode //C - 1286. Iterator for Combination
c语言·算法·leetcode
北极有牛12 小时前
cpp学习笔记--常量指针
java·开发语言·算法
GPU实战笔记12 小时前
云端 GPU 训练的账户余额提醒:它能说明什么,不能说明什么?
深度学习·算法·成本管理·gpu云计算·云端训练
浮链序12 小时前
怎么证明"你这个模型是偷我的"——把蒸馏变成取证工具
算法·安全·llm
小O的算法实验室12 小时前
IEEE TMC,面向异构物联网的多目标量子行为拓扑优化算法
算法