Leetcode202. 快乐数

news/2024/10/20 11:53:46/

Every day a leetcode

题目来源:202. 快乐数

解法1:hash

根据几个例子,我们发现只有2种结果:

  1. 最终会得到1
  2. 最终进入一个循环

其实得到1后,继续计算(将该数替换为它每个位置上的数字的平方和)也是得到1,相当于进入1的循环。

由此可以看出,计算结果一定得到一个循环。

一个数是否是快乐数,取决于循环的入口是不是1。

我们使用STL容器unordered_map作为哈希表。

代码:

/** @lc app=leetcode.cn id=202 lang=cpp** [202] 快乐数*/// @lc code=start
class Solution
{
public:int getNext(int n){int sum = 0;while (n > 0){int x = n % 10;sum += x * x;n /= 10;}return sum;}bool isHappy(int n){unordered_map<int, bool> umap;while (n != 1 && umap.find(n) == umap.end()){umap.insert(pair<int, bool>(n, true));n = getNext(n);}return n == 1;}
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

在这里插入图片描述

解法2:快慢指针

通过反复调用getNext(n)得到的链是一个隐式的链表。隐式意味着我们没有实际的链表节点和指针,但数据仍然形成链表结构。起始数字是链表的头 “节点”,链中的所有其他数字都是节点。next指针是通过调用 getNext(n) 函数获得。

意识到我们实际有个链表,那么这个问题就可以转换为检测一个链表是否有环。因此我们在这里可以使用弗洛伊德循环查找算法。这个算法是两个奔跑选手,一个跑的快,一个跑得慢。在龟兔赛跑的寓言中,跑的慢的称为 “乌龟”,跑得快的称为 “兔子”。

不管乌龟和兔子在循环中从哪里开始,它们最终都会相遇。这是因为兔子每走一步就向乌龟靠近一个节点(在它们的移动方向上)。

在这里插入图片描述

使用 “快慢指针” 思想,找出循环:“快指针” 每次走两步,“慢指针” 每次走一步,当二者相等时,即为一个循环周期。此时,判断是不是因为 1 引起的循环,是的话就是快乐数,否则不是快乐数。

注意:此题不建议用集合记录每次的计算结果来判断是否进入循环,因为这个集合可能大到无法存储;另外,也不建议使用递归,同理,如果递归层次较深,会直接导致调用栈崩溃。不要因为这个题目给出的整数是 int 型而投机取巧。

初始化快指针fast为n,慢指针slow为n。

fast = getNext(getNext(fast));
slow = getNext(slow);

最后判断fast是否为1。

代码:

class Solution
{
public:int getNext(int n){int sum = 0;while (n > 0){int x = n % 10;sum += x * x;n /= 10;}return sum;}bool isHappy(int n){int fast = n, slow = n;do{fast = getNext(getNext(fast));slow = getNext(slow);} while (fast != slow);return fast == 1;}
};

结果:

在这里插入图片描述

复杂度分析:

在这里插入图片描述


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

相关文章

PyEcharts数据可视化(1)——配置项

PyEcharts 学习连接 一、查看pyecharts版本 import pyecharts print(pyecharts.__version__)输出&#xff1a;1.9.0 二、绘制第一个图表 from pyecharts.charts import Bar bar Bar() # 创建柱形图对象 bar.add_xaxis(["衬衫","羊毛衫","雪纺衫…

不得不用ChatGPT的100个理由……

❝ 最近无论在哪&#xff0c;很多人都在吹ChatGPT无所不能&#xff0c;动不动就是AI要颠覆人类&#xff0c;很多人害怕有一天AI会取代自己&#xff0c;我认为明显是多虑了…… ❝ 当然&#xff0c;也有很多小白试用了ChatGPT之后&#xff0c;并没有感觉到他很强大&#xff0c;主…

软件过程改进的12条

软件过程改进的12条&#xff1a; 过程改进必须做起来 软件工程是个实践的事&#xff0c;必须要做起来&#xff01; 我们实施软件过程改进&#xff0c;是为了提高组织的软件工程能力&#xff0c;而提高软件工程能力不是看你掌握了多少理论知识&#xff0c;能力必须通过实践获…

阿里测试8年,肝到P8只剩他了····

在阿里工作了8年&#xff0c;工作压力大&#xff0c;节奏快&#xff0c;但是从技术上确实得到了成长&#xff0c;尤其是当你维护与大促相关的系统的时候&#xff0c;熬到P7也费了不少心思&#xff0c;小编也是个爱学习的人&#xff0c;把这几年的工作经验整理成了一份完整的笔记…

Baklib如何帮助企业设计并维护FAQ页面?

作为现代企业的一部分&#xff0c;客户支持服务是为客户提供解决方案、回答问题和解决技术难题的关键部分。而其中最重要的一个基本工具是FAQ页面&#xff08;Frequently Asked Questions&#xff09;&#xff0c;它可以有效地减轻客户支持压力和提高工作效率。然而&#xff0c…

利用Iptables构建虚拟路由器

利用Iptables构建虚拟路由器 &#xff08;1&#xff09;修改网络类型 在VMware Workstation软件中选择“编辑→虚拟网络编辑器”菜单命令&#xff0c;在虚拟网络列表中选中VMnet1&#xff0c;将其配置为“仅主机模式&#xff08;在专用网络内连接虚拟机&#xff09;”&#x…

eBPF技术介绍

前言 eBPF起源于linux内核&#xff0c;它可以以砂箱程序运行在操作系统内核的特权上下文&#xff0c;高效&#xff0c;安全&#xff0c;易于扩展而不需要修改内核源码或者加载内核模块。 操作系统一直是实现观测&#xff0c;安全和网络功能的最理想的地方&#xff0c;因为内核的…

带你了解vue3组合式api基本写法

本文的目的&#xff0c;是为了让已经有 Vue2 开发经验的 人 &#xff0c;快速掌握 Vue3 的写法。 因此&#xff0c; 本篇假定你已经掌握 Vue 的核心内容 &#xff0c;只为你介绍编写 Vue3 代码&#xff0c;需要了解的内容。 一、Vue3 里 script 的三种写法 首先&#xff0c;Vue…