【LeetCode面试150】——202快乐数

news/2024/11/22 14:31:09/

博客昵称:沈小农学编程

作者简介:一名在读硕士,定期更新相关算法面试,欢迎关注小弟!

PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘

题目难度:简单

默认优化目标:最小化时间复杂度。

Python默认为Python3。

1 题目描述

编写一个算法来判断一个数 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 <= 231 - 1

2 题目分析

输入是一个整数n,输出是布尔值。约束条件是,如果是快乐数,返回true;反之,返回false。

根据快乐数的定义,我们猜测有以下三种可能:

  1. 最终到1

  1. 最终会进入循环

  2. 值会越来越大,最后到无穷大

到1的情况如下图所示:

循环的情况如下图所示:

现在我们来分析第三种情况。

我们对不同位数的数取最大值,看看它们的下一个数和它们自身相比的是变大还是变小了。

位数最大下一个数
1981
299162
3999243
49999324
1399999999999991053

对于三位数字,他不可能大于243;而在4位以及4位以上的数字,最终也会跌落到3位数。所以,在最坏情况下,算法会在243以下的数字上循环,要么继续循环,要么到1。所以不会出现第三种情况。

3 代码实现

3.1 哈希表

我们使用哈希表记录已经出现过的快乐数,用于检查某个数是否在循环链当中。

时间复杂度O(log n),空间复杂度O(log n)。当n足够大时,这和n的位数有关,即log n。

C++代码实现

class Solution {
public:bool isHappy(int n) {auto getNext = [](int n) {int sum = 0;while (n > 0) {int digit = n % 10;n /= 10;sum += digit * digit;}return sum;};
​std::unordered_set<int> seen;while (n != 1 && seen.find(n) == seen.end()) {seen.insert(n);n = getNext(n);}
​return n == 1;}
};
 

Python代码实现

python">class Solution:def isHappy(self, n: int) -> bool:def nexthappy(n):sum=0while n>0:n,d=divmod(n,10)sum+=d**2return sumseen=set()while n!=1 and n not in seen:seen.add(n)n=nexthappy(n)
​return n==1

3.2 快慢指针法

我们使用两个指针,一个叫“兔子”,一个叫“乌龟”。“兔子”一次前进两格,“乌龟”一次一格。如果n是一个快乐数,即没有循环,那么快跑者会比慢跑者先到达数字1;反之,会在同一个数上相遇。

时间复杂度O(log n),空间复杂度O(1)。

C++代码实现

class Solution {
public:bool isHappy(int n) {auto getNext = [](int n) {int sum = 0;while (n > 0) {int digit = n % 10;n /= 10;sum += digit * digit;}return sum;};
​int slow = n;int fast = getNext(n);while (fast != 1 && slow != fast) {slow = getNext(slow);fast = getNext(getNext(fast));}
​return fast == 1;}
};

Python代码实现

python">class Solution:def isHappy(self, n: int) -> bool:def nexthappy(n):sum=0while n>0:n,d=divmod(n,10)sum+=d**2return sum
​slow=nfast=nexthappy(n)while fast!=1 and slow!=fast:slow=nexthappy(slow)fast=nexthappy(nexthappy(fast))return fast==1

参考文献

力扣面试经典150题

力扣官方题解


http://www.ppmy.cn/news/1549056.html

相关文章

力扣 LeetCode 98. 验证二叉搜索树(Day9:二叉树)

解题思路&#xff1a; 方法一&#xff1a;直接中序遍历放入数组&#xff08;非常直观的想法&#xff09; 需要注意用for循环进行重复值的判断&#xff0c;二叉搜索树不能有值相等的节点 class Solution {List<Integer> list new ArrayList<>();public boolean …

Redis 集群主要有以下几种类型

Redis 集群主要有以下几种类型&#xff1a; 主从复制模式&#xff1a; 这种模式包含一个主数据库实例&#xff08;master&#xff09;与一个或多个从数据库实例&#xff08;slave&#xff09;。客户端可以对主数据库进行读写操作&#xff0c;对从数据库进行读操作&#xff0c;主…

Kafka Stream实战教程

Kafka Stream实战教程 1. Kafka Streams 基础入门 1.1 什么是 Kafka Streams Kafka Streams 是 Kafka 生态中用于 处理实时流数据 的一款轻量级流处理库。它利用 Kafka 作为数据来源和数据输出&#xff0c;可以让开发者轻松地对实时数据进行处理&#xff0c;比如计数、聚合、…

2024-11-18-sklearn学习(1)-线性回归(2)

文章目录 sklearn学习&#xff08;1&#xff09;-线性回归(2)3.Lasso&#xff08;拟合系数稀疏的线性模型&#xff09;3.1 Lasso基础3.2 Lasso的正则化参数设置3.2.1 使用交叉验证3.2.1 基于信息标准的模型选择3.2.1 与 SVM&#xff08;支持向量机&#xff09; 的正则化参数的比…

【halcon技巧】如何扩大背景

背景介绍 我需要将大量零散的区域聚合到一起,所以会用到膨胀,将分散的区域粘到一起。 形成一个整体之后还需要恢复到之前的大小!于是就会用到腐蚀。这样就能恢复到和之前一样的大小。 但是理想很饱满,现实很意外。现在出现的情况是,膨胀时 图片右边膨胀的区域大小超出的…

springboot基于微信小程序的食堂预约点餐系统

摘 要 基于微信小程序的食堂预约点餐系统是一种服务于学校和企事业单位食堂的智能化解决方案&#xff0c;旨在提高食堂就餐的效率、缓解排队压力&#xff0c;并优化用户的就餐体验。系统作为一种现代化的解决方案&#xff0c;为食堂管理和用户就餐提供了便捷高效的途径。它不仅…

cuda共享内存

在 CUDA 或 HIP 程序中使用共享内存时&#xff0c;需要注意以下关键点&#xff0c;以确保代码的正确性和高效性&#xff1a; 1. 共享内存的特点 线程块级别共享&#xff1a;共享内存是线程块&#xff08;block&#xff09;内的所有线程共享的&#xff0c;线程块外的线程无法访…

【PCIE链路训练介绍】

PCIE链路训练介绍 1 PCIE链路初始化与训练1.1 链路训练达成目标1.1.1 位锁定1.1.2 字符锁定(Gen1 & Gen2 Only&#xff09;or 块锁定(Gen3 only)1.1.3 确定链路宽度1.1.4 通道位置翻转(Lane Reversal)1.1.5 信号极性翻转&#xff08;Polarity Inversion&#xff09;1.1.6 确…