每日OJ题_算法_双指针③_力扣202. 快乐数

目录

[力扣202. 快乐数](#力扣202. 快乐数)

解析代码


力扣202. 快乐数

202. 快乐数 - 力扣(LeetCode)

难度 简单

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

「快乐数」 定义为:

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

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

示例 1:

复制代码
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

复制代码
输入:n = 2
输出:false

提示:

  • 1 <= n <= 23^1 - 1
cpp 复制代码
class Solution {
public:
    bool isHappy(int n) {

    }
};

解析代码

类似判断环形链表的快慢指针,了解一下鸽巢原理:

看一下环形链表的讲解:

数据结构与算法⑥(第二章OJ题,下)后八道链表面试题-CSDN博客

此题为什么一定会成环?:

此题中最大范围为23^1 - 1 等于 2.1*10^9 小于 9999999999(10个9)-> 每个数平方后相加为9^2 * 10 = 810,所以超过810次每个数平方后,至少会有两个数落在[1,810],此时成环的时候slow等于1就是快乐数。

代码:

cpp 复制代码
class Solution {
public:
    int bitSum(int n)
    {
        int sum = 0;
        while(n)
        {
            int x  = n % 10;
            sum += x*x;
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {
        int slow = n, fast  = bitSum(n);
        while(slow != fast)
        {
            slow = bitSum(slow);
            fast = bitSum(bitSum(fast));
        }
        return slow == 1;
    }
};
相关推荐
wen__xvn10 分钟前
代码随想录算法训练营DAY1第一章 数组part01
数据结构·算法·leetcode
樊梓慕14 分钟前
【嵌入式】buildroot构建ros2环境
c++·机器人
爱编码的傅同学14 分钟前
【程序地址空间】页表的映射方式
c语言·数据结构·c++·算法
序属秋秋秋14 分钟前
《Linux系统编程之进程控制》【进程替换】
linux·c语言·c++·操作系统·进程·系统编程·进程替换
hslinux17 分钟前
NDK 通过configure 编译C++源码通用脚本
android·c++·ndk·configure
盖世灬英雄z22 分钟前
数据结构与算法学习(二)
c++·学习
qq_3106585123 分钟前
webrtc源码走读(三)核心引擎层——音频引擎
服务器·c++·音视频·webrtc
UID962223 分钟前
[特殊字符] 无级变速传动(CVT)技术突破之道 | 易经×数学×工程的跨维度破解方案
算法·数学建模·开源
嵌入式@秋刀鱼28 分钟前
ROS开发学习记录【一】
linux·c++·笔记·学习
生信碱移29 分钟前
神经网络单细胞预后分析:这个方法直接把 TCGA 预后模型那一套迁移到单细胞与空转数据上了!竟然还能做模拟敲除与预后靶点筛选?!
人工智能·深度学习·神经网络·算法·机器学习·数据挖掘·数据分析