双指针练习:快乐数

2024-06-01 11:12
文章标签 指针 练习 快乐

本文主要是介绍双指针练习:快乐数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.题目链接:202.快乐数

2.题目描述:

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

「快乐数」 定义为:

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

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

3.题目分析:

1.根据题意以及测试用例我们发现,我们会频繁的对一个数进行取余 求余方 再取模。

因此,我们可以写一个函数封装这个操作。如何求一个数n每个位置上的数字的平方和?

        a.把数 n 每一位的数提取出来

                i. int t = n % 10 提取个位;

                ii. n = n / 10 干掉个位;

                直到 n 的值变为0;

        b.提取每一位的时候,用一个变量 tmp 记录这一位的平方与之前提取位数的平方和

                tmp = tmp + t * t

2.拿到一个题,我们先分析一个案例,例如 n = 19 

如果n = 2

由此我们可以发现:如果数n 是一个快乐数,它的最后一个数是1

如果数n 不是快乐数,它最终会形成一个环,不停的循环下去。

接着我们拓展一个原理:鸽巢原理(抽屉原理)

n个巢,有n+1个鸽子,可以推出至少有一个巢,里面的鸽子数大于1;

因此我们来看题目范围

这是一个整形的最大数,大约为 2.1*10^9

我们可以假设一个比他更大的数 整形最大数约为10位数,且最大的数一定不会超过99999 99999

我们来计算这个数每个位置上的数字的平方和,9^2 * 10 = 810,也就是最大的数是810

题目n最小为1,所以每个位置上的数字平方和的范围在 [1,810] 之间,有810个数。

由此可以推出:一个数经过不停的分割成下一个数,经过811次 这个分割后的数一定会出现重复的情况,也就是会进环,因此我们使快慢指针追击即可

代码:

class Solution {
public://  封装一个函数,实现个位数字平方和相加int bitSum(int n){int sum = 0;//定义相加后的结果while(n){//不停的取模取余,直到这个数为0为止int bit = n % 10;n = n/10;sum += bit * bit;}return sum;}bool isHappy(int n) {int slow = n;int fast = bitSum(n);//下一次被操作数的结果while(slow != fast){slow = bitSum(slow);//slow走一步fast = bitSum(fast);fast = bitSum(fast);//fast走两步//根据鸽巢原理可知,slow和fast一定会相遇}return slow == 1;//判断最后结果是不是1}
};

这篇关于双指针练习:快乐数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020842

相关文章

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>

014.Python爬虫系列_解析练习

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

【C++】作用域指针、智能指针、共享指针、弱指针

十、智能指针、共享指针 从上篇文章 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配-CSDN博客 中我们知道,你的对象是创建在栈上还是在堆上,最大的区别就是对象的作用域不一样。所以在C++中,一旦程序进入另外一个作用域,那其他作用域的对象就自动销毁了。这种机制有好有坏。我们可以利用这个机制,比如可以自动化我们的代码,像智能指针、作用域锁(scoped_lock)等都是利用了这种机制。