【优选算法】——Leetcode——202—— 快乐数

 

目录

1.题目 

2. 题⽬分析:

3.简单证明:

4. 解法(快慢指针):

算法思路:

补充知识:如何求⼀个数n每个位置上的数字的平⽅和。

 总结概括

 5.代码实现

1.C语言

2.C++


1.题目 

202. 快乐数

编写一个算法来判断一个数 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. 题⽬分析:


为了⽅便叙述,将「对于⼀个正整数,每⼀次将该数替换为它每个位置上的数字的平⽅和」这⼀个操作记为 x 操作;
题⽬告诉我们,当我们不断重复 x 操作的时候,计算⼀定会「死循环」,死的⽅式有两种:
▪ 情况⼀:⼀直在 1 中死循环,即 1 -> 1 -> 1 -> 1...... 
▪ 情况⼆:在历史的数据中死循环,但始终变不到 1 
由于上述两种情况只会出现⼀种,因此,只要我们能确定循环是在「情况⼀」中进⾏,还是在「情
况⼆」中进⾏,就能得到结果。 

3.简单证明:


a. 经过⼀次变化之后的最⼤值 9^2 * 10 = 810 ( 2^31-1=2147483647 。选⼀个更⼤的最
⼤ 9999999999 ),也就是变化的区间在[1, 810] 之间;
b. 根据「鸽巢原理」,⼀个数变化 811 次之后,必然会形成⼀个循环;
c. 因此,变化的过程最终会⾛到⼀个圈⾥⾯,因此可以⽤「快慢指针」来解决。


4. 解法(快慢指针):


算法思路:

根据上述的题⽬分析,我们可以知道,当重复执⾏ x 的时候,数据会陷⼊到⼀个「循环」之中。⽽「快慢指针」有⼀个特性,就是在⼀个圆圈中,快指针总是会追上慢指针的,也就是说他们总会相遇在⼀个位置上。如果相遇位置的值是 1 ,那么这个数⼀定是快乐数;如果相遇位置不是 1 的话,那么就不是快乐数。 

补充知识:如何求⼀个数n每个位置上的数字的平⽅和。

a. 把数n 每⼀位的数提取出来:
循环迭代下⾯步骤:
i. int t = n % 10 ?提取个位;
ii. n /= 10 ⼲掉个位;
直到 n 的值变为 0 ;
b. 提取每⼀位的时候,⽤⼀个变量 tmp 记录这⼀位的平⽅与之前提取位数的平⽅和
▪ tmp = tmp + t * t

 总结概括

1.定义快慢指针
2.慢指针每次向后移动一步快指针每次向后移动两步
3.判断相遇时候的值即可

 5.代码实现

1.C语言

 int bitSum(int n){// 返回 n 这个数每⼀位上的平⽅和{int sum = 0;while (n){int t = n % 10;sum += t * t;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;
}

2.C++

class Solution 
{
public:int bitSum(int n){// 返回 n 这个数每⼀位上的平⽅和{int sum = 0;while (n){int t = n % 10;sum += t * t;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;
}
}
;

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

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

相关文章

vue-cli2,vue-cli3,vite 生产环境去掉console.log

console.log一般都是在开发环境下使用的&#xff0c;在生产环境下需要去除 &#xff0c;如果手动删除未免也太累了&#xff0c;我们可以用插件对于具体环境全局处理。 vue-cli2 项目build 下面webpack.prod.config.js 文件中: plugins: [new webpack.DefinePlugin({process.en…

SHUISHUISHUI

对于C8T6程序存储容量是64K&#xff0c;一般写一个程序只占前边很小一部分空间&#xff0c;剩下的大部分空间可以利用&#xff0c;比如存储一些自定义的数据&#xff0c;充分利用资源&#xff0c;但是需要注意不能覆盖原有程序&#xff0c;否则将程序破坏&#xff0c;无法运行。…

STL vector详解

STL vector详解 1. 简介2. vector的内存机制3. vector 基类源码_Vector_base3.1. vector 基类成员变量3.2. vector 基类方法3.3. _Vector_base 总结 4. vector类4.1. 方法 1. 简介 本文参考vector源码&#xff0c;主要介绍vector的设计思路&#xff0c;了解一些方法的实现原理…

20240506 深度学习高级技术点

1.基于BN层剪枝 基于Batch Normalization (BN)层进行剪枝是一种常用的模型压缩方法&#xff0c;特别是在卷积神经网络(CNNs)中。BN层在训练期间用于加速收敛和提高模型的泛化能力&#xff0c;而在剪枝过程中&#xff0c;BN层提供的统计信息&#xff08;特别是均值(mean)和方差…

HarmonyOS实战开发-如何通过BlendMode属性来实现挂件和图片的混合

介绍 本实例主要通过BlendMode属性来实现挂件和图片的混合&#xff0c;通过更改不同的混合参数&#xff0c;能够展示不同的混合效果。 效果图预览 使用说明&#xff1a; 1.进入页面&#xff0c;点击挂件区域&#xff0c;进行挂件和图片的混合&#xff0c;点击不同的挂件&…

miniforge:Anaconda的代餐

诸神缄默不语-个人CSDN博文目录 总之conda / anaconda / miniforge / mamba都是差不多一个系列的Python环境管理工具。我一般自己用的话会用Anaconda&#xff0c;我之前也写过教程&#xff1a;Anaconda教程&#xff08;持续更新ing…&#xff09; miniforge是因为我队友用&am…

Golang 开发实战day12 - Pointer

&#x1f3c6;个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 Golang 开发实战day12 - 指针…

Python实验代码定时调起

Python代码实验调参需要等待1小时运行完成&#xff0c;自动将提前设置的5组参数&#xff08;每组参数有8个&#xff09;间隔1小时之后让Python代码再次自动依次调起运行其中的一组参数&#xff0c;每次跑完将实验结果写一个文件在本地存储通过邮件发送运行结果到指定QQ邮箱 im…

国家电网某地电力公司网络硬件综合监控运维项目

国家电网某地电力公司是国家电网有限公司的子公司&#xff0c;负责当地电网规划、建设、运营和供电服务&#xff0c;下属多家地市供电企业和检修公司、信息通信公司等业务支撑实施机构。 项目现状 随着公司信息化建设加速&#xff0c;其信息内网中存在大量物理服务器、存储设备…

Linux动态库与静态库解析

文章目录 一、引言二、C/C源文件的编译过程三、静态库1、静态库的定义和原理2、静态库的优缺点3、静态库的创建和使用a、创建静态库b、使用静态库 四、动态库1、动态库的定义和原理2、动态库的优缺点3、动态库的创建和使用示例a、创建动态库b、使用动态库 五、动静态库的比较 一…

Python使用多进程和多线程处理数据

多进程适合于计算密集型任务和需要大量计算资源的场景&#xff0c;而多线程适合于I/O密集型任务和需要快速上下文切换的场景。 多线程版本 import time import concurrent.futures from tqdm import tqdmfile_list [file1.txt, file2.txt, file3.txt]*10def process_file(fi…

最长连续序列(Lc128)——哈希表

给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;4 …

Pytorch学习笔记——神经网络基本框架

一、神经网络是什么 神经网络在人工智能和深度学习的领域&#xff0c;一般称为人工神经网络&#xff0c;即ANN(Artificial Neural Network)&#xff0c;是一种模仿人脑神经系统工作方式的计算模型。被广泛应用于人工智能、自动控制、机器人、统计学等领域的信息处理中。 二、…

套管外径测量仪 多尺寸型号 规格全可定制

套管&#xff08;bushing&#xff09;是一种将带电导体引入电气设备或穿过墙壁的一种绝缘装置。前者称为电器套管&#xff0c;后者称为穿墙套管。套管通常用在建筑地下室&#xff0c;是用来保护管道或者方便管道安装的铁圈。套管的分类有刚性套管、柔性防水套管、钢管套管及铁皮…

【快速幂取模】

求 a 的 b 次方对 p 取模的值&#xff0c;其中 1≤a,b,p≤109 输入 三个用空格隔开的整数a,b和p。 输出 一个整数&#xff0c;表示ab mod p的值。 样例输入 Copy 2 3 9样例输出 Copy 8 思路&#xff1a; 这里借鉴一下大佬的用例&#xff1a; #include<bits/stdc.h&…

idea提示 CreateProcess error=206, 文件名或扩展名太长有哪些具体的解决方法

背景&#xff1a; 项目启动后提示CreateProcess error206&#xff0c;通常我本地是将shorten command line改成如下就可以解决&#xff0c;但是今天遇到一个&#xff0c;无论这里怎么设置都是启动提示扩展名太长&#xff0c;经过一番处理问题终于解决&#xff0c;特此记录一下。…

《21天学通C++》(第十八章)STL list和forward_list

std::list的特点 1.插入和删除操作高效&#xff1a;在任意位置插入或删除元素的开销是 O(1)&#xff0c;不需要像 std::vector 那样可能需要移动大量元素。 2.不支持随机访问&#xff1a;访问 std::list 中的元素需要从头开始遍历到所需位置&#xff0c;访问特定元素的时间复杂…

面试笔记——垃圾回收

对象被垃圾回收的时机 垃圾回收主要面向的是堆中的对象。简单一句就是&#xff1a;如果一个或多个对象没有任何的引用指向它了&#xff0c;那么这个对象现在就是垃圾&#xff0c;如果定位了垃圾&#xff0c;则有可能会被垃圾回收器回收。 如果要定位什么是垃圾&#xff0c;有两…

linux命令行与shell脚本大全——学习笔记(7-8章)

第7章 理解Linux文件权限 用户、用户组、其他用户 用户权限是通过创建用户时分配的用户 ID&#xff08;user ID&#xff0c;UID&#xff09;来跟踪的。UID 是个数值&#xff0c;每个 用户都有一个唯一的 UID。但用户在登录系统时是使用登录名&#xff08;login name&#xff…

分布式锁-快速入门

文章目录 前言一、基础概念1.1 什么是锁1.2 什么是分布式锁1.3 锁和事务的区别二、分布式锁基础理论2.1 为什么要使用分布式锁2.2 分布式锁特性2.3 分布式锁的实现方式总结前言 由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题…