每日一题:痛苦数

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

「快乐数」 定义为:

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

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

示例 1:

输入:n = 19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

示例 2:

输入:n = 2
输出:false

提示:

  • 1 <= n <= 2^31 - 1

拿到一个全新的概念:快乐数,先来找个规律。

从举例计算中可以发现,快乐数通过有限步骤最终可以得到 1 ,和题目描述相同。

而痛苦数有一个规律,在计算的过程中,他们不是在循环里(如图2、3、4行),就是在去往循环的路上(如图5、6行)。

所以不要让任何人或事困住你,那将变得不幸,跳出循环,你就是快乐的。

到这里这道题就有两个解决方向:

  • 暴力法,我们能完全枚举出痛苦数循环里的所有数,因此在计算过程中判断是否得到了痛苦循环中的数即可。
  • 找环。----> 问题被同化成:链表中是否存在环。

方法一:暴力法

我们可以找到循环:

4→16→37→58→89→145→42→20→4

有且仅有这样一个循环,可以验证所有痛苦数都会最终进入这个循环。

所以将这组数保存下来,计算过程中对每个结果进行验证,如果结果在这些数中就返回false。否则不会进入死循环。

class Solution {
public:bool isHappy(int n) {unordered_set<int> pain = {4,16,37,58,89,145,42,20,4};while(n != 1){if(pain.contains(n)){return false;}n = cal(n); }return true;}int cal(int n){int result = 0;while(n > 0){int temp = n % 10;n /= 10;result += temp * temp;}return result;}
};

进一步的,在这种思路下,还能找到进一步的规律,所有数都会在计算过程中的到个位数

个位数中,1是快乐数(7也是,但7在计算中也能变成1)。而在上面的唯一循环中,有个位数4。

所以可以进一步修改代码:

class Solution {
public:bool isHappy(int n) {while (true) { int new = 0; while (n > 0) {int temp = n % 10;new += temp * temp; n /= 10; }if (new == 1) return true; if (new == 4) return false; n = new; }}
};

方法二:快慢指针

使用两个指针分别步长是 1 和 2,也就是计算下一个数,和接下来的第二个数。步长为 2 的为快指针。

如果 n 是快乐数,即没有循环,那么快指针最终会比慢指针先到达数字 1。

如果 n 是痛苦数,那么最终快指针和慢指针将在循环内的同一个数字上相遇。

class Solution {
public:bool isHappy(int n) {int slow = n;int fast = cal(n);while(fast != 1 && fast != slow){fast = cal(cal(fast));slow = cal(slow);}return fast == 1;}int cal(int n){int result = 0;while(n > 0){int temp = n % 10;n /= 10;result += temp * temp;}return result;}
};

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

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

相关文章

CRAFT文字检测算法解析和基于C++和TensorRT的推理实现

本文讲解了CVPR 2019的一篇文字检测算法《Character Region Awareness for Text Detection》的原理&#xff0c;并给出我使用C和TensorRT重新实现的推理&#xff0c;速度比原版代码快12倍。 论文&#xff1a;https://arxiv.org/pdf/1904.01941.pdf 官方代码&#xff1a;https:…

simple-jwt快速入门(包含自定制)

simple-jwt快速入门(包含自定制) 目录 simple-jwt快速入门(包含自定制)安装路由层视图层全局配置前端传入参数配置文件定制登录返回格式定制payload格式自定制签发-认证 安装 pip install djangorestframework-simplejwt路由层 from rest_framework_simplejwt.views import T…

SAP 销售业务中免费货物的会计核算

此博文主要介绍SAP销售业务中免费货物解决方案中&#xff0c;免费货物的会计核算。如果需要进一步了解SAP SD 销售与分销业务中&#xff0c;免费货物的标准解决方案概览&#xff0c;可先了解本博客博文&#xff1a;SAP销售与分销中的免费货物解决方案相关文章&#xff1a; htt…

SQLite R*Tree 模块(三十三)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite FTS3 和 FTS4 扩展(三十二) 下一篇:SQLite轻量级会话扩展&#xff08;三十四&#xff09; 1. 概述 R-Tree 是一个特殊的 专为执行范围查询而设计的索引。R-树最常见的是 用于地理空间系统&#xff0c;其中…

【Interconnection Networks 互连网络】Dragonfly Topology 蜻蜓网络拓扑

蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数2. Topology Description 拓扑描述3. Topology Variations 拓扑变体 蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数 Dragonfly拓扑参数&#xff1a; N N N: 网络中终端(terminal)的总数量 p p p: 连接到每个路由器的终端数量 a a a: 每…

算法|最大堆、最小堆和堆排序的实现(JavaScript)

一些概念 堆&#xff1a;特殊的完全二叉树&#xff0c;具有特定性质的完全二叉树。大根堆&#xff1a;父节点 > 子节点小根堆&#xff1a;父节点 < 子节点 二叉堆也属于完全二叉树&#xff0c;所以可以用数组表示。 若下标从1开始&#xff0c;左节点为 2*i &#xff0…

数字谐振器设计

数字谐振器设计 电路里的谐振:当电路中激励的频率等于电路的固有频率时&#xff0c;电路电磁振荡的振幅也将达到峰值。 形式一 形式二 例子

Python程序设计 字典

教学案例十 字典 1. 判断出生地 sfz.txt文件中存储了地区编码和地区名称 身份证的前6位为地区编码&#xff0c;可以在sfz.txt文件中查询到地区编号对应的地区名称 编写程序&#xff0c;输入身份证号&#xff0c;查询并显示对应的地区名称 若该地区编码不在文件中&#xff0c;…

文本生成任务的评价方法BLEU 和 ROUGE

BLEU 是 2002 年提出的&#xff0c;而 ROUGE 是 2003 年提出的。这两种指标虽然存在着一些问题&#xff0c;但是仍然是比较主流的评价指标。 BLUE BLEU 的全称是 Bilingual evaluation understudy&#xff0c;BLEU 的分数取值范围是 0&#xff5e;1&#xff0c;分数越接近1&a…

【JavaWeb】Day51.Mybatis动态SQL

什么是动态SQL 在页面原型中&#xff0c;列表上方的条件是动态的&#xff0c;是可以不传递的&#xff0c;也可以只传递其中的1个或者2个或者全部。 而在我们刚才编写的SQL语句中&#xff0c;我们会看到&#xff0c;我们将三个条件直接写死了。 如果页面只传递了参数姓名name 字…

把idea的Java代码中的包打开,以层级的方式显示

我们在使用idea敲谢Java代码的时候&#xff0c;会注意到包显示在一起&#xff0c;这样对于有一些开发来说节省了空间&#xff0c;但是对于一些程序员来说看起来不舒服&#xff0c;而且不好操作。 针对这样的情况&#xff0c;我们需要取消一项勾选。 点击这三个... 取消这个按钮…

LeetCode 热题 100 题解:普通数组部分

文章目录 题目一&#xff1a;最大子数组和&#xff08;No. 53&#xff09;题解 题目二&#xff1a;合并区间&#xff08;No. 56&#xff09;题解 题目三&#xff1a;轮转数组&#xff08;No. 189&#xff09;题解 题目四&#xff1a;除自身以外数组的乘积&#xff08;No. 238&a…