【leetcode 力扣刷题】快乐数/可被k整除的最小整数(可能存在无限循环的技巧题)

news2024/12/26 11:10:43

可能存在无限循环的技巧题

  • 202. 快乐数
    • 数学分析
  • 1015. 可被k整除的最小整数
  • 数学分析

202. 快乐数

题目链接:202. 快乐数
题目内容:
在这里插入图片描述理解题意,快乐数就是重复每位数的平方之和得到的新数的过程,最终这个数能变成1。变成1以后,即便重复上述过程,也一直是1的循环,因此在重复得到新数的过程中,如果这个数等于1就停止。
问题:如果始终变不到1呢?题目中提到无限循环但始终变不到1,无限循环就意味着重复,如果重复找新数的过程中得到的数p在之前是出现过的,那么之后找到的数到下一次找到p前,都是重复出现的,直到变成p以后又继续循环。因此每次得到一个新数都要判断之前是否出现过,如果出现过就终止过程,返回false。
查找这个数是否出现过,用什么数据结构? 哈希表!【快速查找一个元素是否存在】 用什么实现哈希表呢?前面的题目有用到数组、set和map。 对于此题,一个数n,将其每位数求平方再相加这个重复过程中会得到多少种数是不确定的,因此不能用数组;map存<key,value>此题我们不需要value,只需要key,因此直接用set。
每次得到一个新数首先判断其每位数平方之后是否为1,是直接返回true;如果不是再判断这个数是否已经出现在set中,如果是,直接返回false;如果不是重复寻找新数的过程并重复上述判断。
代码如下(C++):

class Solution {
public:
    //对整数n每位数求平方再相加求和的过程
    int getsum(int n){
        int sum = 0;
        while(n){
            sum+= (n%10) * (n%10);
            n= n/10;
        }
        return sum;
    }

    bool isHappy(int n) {
        //存出现过的数
        unordered_set<int> count;
        int sum = getsum(n);
        //每位数平方和不等于1才进入循环,找新数
        //如果等于1,即为快乐数
        while(sum != 1){
            //如果已经存在过,就进入循环了
            if(count.count(sum))
                return false;
            else count.insert(sum);
            //找新数
            sum = getsum(sum);
        }        
        return true;
    }
};

数学分析

一个数不是快乐数,那么就进入无限循环,但是万一这个循环内的数字特别大特别多呢?
力扣这道题的官方题解中,分析了9,99,……,9999999等这些共i位数字的最大的情况,各位平方求和后的数字:
在这里插入图片描述
题目中n<=2^31-1,也就是2147483648-1,最多10的10次方,而只有13位的数字,其各位平方之和才能上千。就算各位数平方之和达到了四位数,再求和一次就变成了三位数,再求和一次就变成了243以内。因此再大的数字经过各位数平方求和操作后,大小都会迅速下降,最终控制在243以内,要么进行循环,要么最终变成1。
所以实际上用数组实现哈希表也是可以的,初始化数组长度为243,元素全是0。代码如下(C++):

    bool isHappy(int n) {
        //用数组存出现过的数字
        int count[243] = {0};
        int sum = getsum(n);
        //每位数平方和不等于1才进入循环,找新数
        //如果等于1,即为快乐数
        while(sum != 1){
            //如果已经存在过,就进入循环了
            if( sum<=243 && count[sum-1])
                return false;
            //注意控制下标不要越界
            if( sum<= 243 )
                count[sum-1]++;
            //找新数
            sum = getsum(sum);
        }        
        return true;
    }

1015. 可被k整除的最小整数

题目链接:1015. 可被k整除的最小整数
题目内容:
在这里插入图片描述
理解题意:①正整数需要满足:能够被k整除的【即n%k=0】,仅包含数字1【比如11,1111,111…111等】;②满足①中的条件的n可能不止一个,那么要找其中最小的;③返回n的长度而不是数字n本身。
如何表示这样的n? 假设n初始化为1,然后逐渐增大n = n*10 + 1,直到找到n满足题意。但是这样的int类型的n最多只能有10位,继续增大n就超出了int类型的范围,即便是64位的带符号的整数(最大为18446744073709551616),n的长度也只有20。 因此不能直接用上式表示n,并且本题本身也不要求返回n而是n的长度。
解法

  • 用余数r来代替n:
    假设:n%k = r (即:n = k*i + r ,i≥1)
    那么:n’%k = (n*10+1)%k = (k*i*10 +r*10 +1) %k = (r*10+1)%k
    因此可以用 r*10+1代替n*10+1
    并且因需要求出n的长度,不需要记录n,因此用余数r来代替n
  • 如果无解就会出现循环,存在a>b(都是由数字1组成的),a%k = b%k ≠ 0,用哈希表(set)存出现过的余数,如果重复出现就表示进入循环无解:

【解法①】用哈希表存出现过的余数,如果再次出现说明进入循环无解:

class Solution {
public:
    int smallestRepunitDivByK(int k) {
        int res = 1 % k;
        int len = 1;
        //存出现过的余数
        unordered_set <int> set_res;
        //余数=0就不进入循环,直接返回结果
        while(res){
        	//如果余数≠0且出现了重复,就直接返回
            if(set_res.count(res))  
                return -1;
            set_res.insert(res);
            res = (res * 10 + 1) % k;
            len++;
        }
        return len;
    }
};

【优化】实际上余数r的范围是0~k-1,总共k个数字,那么如果有解,循环k次内,一定会找到结果:

class Solution {
public:
    int smallestRepunitDivByK(int k) {
        int res = 1%k, len = 1;
        //最多循环k次
        for(int i = 0 ;i < k ;i++){
            if(!res) return len;
            res = (res*10 + 1)%k;
            len++;           
        }
        return -1;   
    }    
};

数学分析

  • 能够直观的知道k是否有解?
    如果k是2或者5的倍数,因为n是奇数肯定不能被2整除,因为n的末尾是1而不是0或者5,肯定不能被5整除。
  • 除2和5以外的k一定有解吗?
    假设有全是1的数字a和b对k同余,即a%k = b%k ,那么(a - b)%k = 0,而a - b = 11…1100…00,可以表示成a - b = (11…11)*(10^x),k不等于2和5的倍数,即k和10是互质的,a-b能够整除k的话,只能是(11…11)能够整除k,11…11恰好全是由1构成的,即11…11就是解,因此k如果不是2和5的倍数,就一定有解。
    代码实现(C++):因为k除2和5的倍数外一定有解,那么就一直寻找就行,直到余数=0
int smallestRepunitDivByK(int k) {
   //如果是2或者5的倍数无解直接返回-1
	if(k%2==0||k%5==0) return -1;
	//n=1,初始长度len=1	
    int len=1;
    //r表示余数,初始n=1,r=n%k=1%k
    int r=1%k;
    //只要余数r不为0,就没有找到可以整除k的数,继续循环
    while(r){
    	len++;
    	//末尾增加1
     	r=r*10+1;
     	//求余
        r=r%k;          
    }
	return len;
}

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

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

相关文章

STM32 串口复习

按数据通信方式分类&#xff1a; 串行通信&#xff1a;数据逐位按顺序依次传输。传输速率较低&#xff0c;抗干扰能力较强&#xff0c;通信距离较长&#xff0c;I/O资源占用较少&#xff0c;成本较低。并行通信&#xff1a;数据各位通过多条线同时传输。 按数据传输方向分类&…

04_Redis与mysql数据双写一致性案例

04——redis与mysql数据双写一致性 一、canal 是什么 canal[ka’nel,中文翻译为水道/管道/沟渠/运河&#xff0c;主要用途是用于MySQL数据库增量日志数据的订阅、消费和解析&#xff0c;是阿里巴巴开发并开源的,采用Java语言开发&#xff1b; 历史背景是早期阿里巴巴因为杭州和…

你知道CSGO转区内购吗?了解下内购系统!

哈喽&#xff0c;大家好&#xff0c;我是童话姐姐&#xff0c;这两天群里很多人都在问关于内购的事情&#xff0c;今天就专门给大家讲一下关于内购的一些情况吧。 1、首先什么是转区内购? 顾名思义&#xff0c;内购就是在游戏内部的一个购买行为&#xff0c;csgo内购自然就是…

MATLAB打开excel读取写入操作例程

本文使用素材含代码测试用例等 MATLAB读写excel文件历程含&#xff0c;内含有测试代码资源-CSDN文库 打开文件 使用uigetfile函数过滤非xlsx文件&#xff0c;找到需要读取的文件&#xff0c;首先判断文件是否存在&#xff0c;如果文件不存在&#xff0c;程序直接返回&#x…

all in one之安装ubuntu-server系统(第二章)

pve安装ubuntu-server系统 安装ubuntu-server系统 参考链接 在pve环境下安装ubuntu服务器版本&#xff0c;安装过程如下&#xff1a; ubuntu官方链接&#xff08;不推荐&#xff0c;下载慢&#xff09; 中科大开源库 阿里开源镜像库 兰州大学开源镜像站 … 自行选择进行下载&…

韦东山-电子量产工具项目:页面系统

代码结构 所有代码都已通过测试跑通&#xff0c;其中代码结构如下&#xff1a; 一、include文件夹 1.1 common.h #ifndef _COMMON_H #define _COMMON_Htypedef struct Region {int iLeftUpX; //区域左上方的坐标int iLeftUpY; //区域左下方的坐标int iWidth; //区域宽度…

Nodejs沙箱逃逸--总结

一、沙箱逃逸概念 JavaScript和Nodejs之间有什么区别&#xff1a;JavaScript用在浏览器前端&#xff0c;后来将Chrome中的v8引擎单独拿出来为JavaScript单独开发了一个运行环境&#xff0c;因此JavaScript也可以作为一门后端语言&#xff0c;写在后端&#xff08;服务端&#…

Unity进阶–通过PhotonServer实现人物选择和多人同步–PhotonServer(四)

文章目录 Unity进阶–通过PhotonServer实现人物选择和多人同步–PhotonServer(四)服务端客户端 Unity进阶–通过PhotonServer实现人物选择和多人同步–PhotonServer(四) 服务端 服务端结构如下&#xff1a; UserModel using System; using System.Collections.Generic; usin…

houdini volume trail volume几种模式

1vdb from polygon 先 attribwrangle v 后vdbfrompolygon v 2 volume 3

在 Transformer 之前生成文本 Text generation before transformers

1. 在 Transformer 之前生成文本 重要的是要注意&#xff0c;生成算法并不是新的。先前的语言模型使用了一个叫做循环神经网络或RNN的架构。尽管RNN在其时代很强大&#xff0c;但由于需要大量的计算和内存来很好 地执行生成任务&#xff0c;所以它们的能力受到了限制。让我们看…

好用的消售管理系统十大排行榜

销售管理是企业经营至关重要的一环。市场上有很多销售管理系统&#xff0c;对小企业来说&#xff0c;购买和实施CRM系统昂贵且复杂。这里有一份好用的10大免费销售管理系统榜单&#xff0c;让您既可以节省成本&#xff0c;又享受到高效的销售管理。 Zoho CRM&#xff1a; Zoh…

Tesla Model S 3对比分析拆解图

文章来源&#xff1a;网络 需要特斯拉电驱样件的请&#xff1a;shbinzer &#xff08;拆车邦&#xff09; 5 款电机&#xff0c;其中扁线永磁同步电机最大功率从 202kW 提升至 220kW&#xff0c;最大扭矩从 404Nm提升至 440Nm。 Model S/X→Model 3/Y&#xff1a;双电机版本…

软考A计划-系统集成项目管理工程师-收尾管理

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

2023河南萌新联赛第(五)场:郑州轻工业大学

A.买爱心气球 原题链接 : 登录—专业IT笔试面试备考平台_牛客网 博弈论 : #include <iostream> using namespace std; int t,n,m; string s1 "Alice",s2 "Bob"; int main() {cin>>t;while(t--){cin>>n>>m;if (n % 3 0) {cou…

02_BigKey

02——BigKey 一、MoreKey案例 大批量往redis里面插入2000w测试数据key 真实生产案例 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LfbSfvNL-1692427337323)(https://you-blog.oss-accelerate.aliyuncs.com/2023/202303052248850.png)] 生产上严…

购买steam余额有风险吗?以及N种被红锁的情况

购买steam余额有风险吗&#xff1f;以及N种被红锁的情况 无论是打游戏的玩家&#xff0c;还是像我们这类靠倒卖装备赚钱的小商贩&#xff0c;都面临充值美金余额的问题&#xff0c;我们现在主要是找的专业充值渠道做代充。 最近我发现群里有极个别学员通过自己的方法找到了一…

Spring源码深度解析二(AOP)

书接上文 9. AOP源码深度剖析 概述 AOP&#xff08;Aspect Orient Programming&#xff09;&#xff1a;面向切面编程&#xff1b; 用途&#xff1a;用于系统中的横切关注点&#xff0c;比如日志管理&#xff0c;事务管理&#xff1b; 实现&#xff1a;利用代理模式&#x…

【Java面试题】线程中start方法和run方法的区别?

start start作用是启动一个新线程。 当用start()开始一个线程后&#xff0c;线程就进入就绪状态&#xff0c;使线程所代表的虚拟处理机处于可运行状态&#xff0c;这意味着它可以由JVM调度并执行。但是这并不意味着线程就会立即运行。只有当CPU分配时间片时&#xff0c;这个线…

05_bitmaphyperloglogGEO

Bitmap&hyperloglog&GEO 面试问 记录对集合中的数据进行统计在移动应用中&#xff0c;需要统计每天的新增用户数和第2天的留存用户数&#xff1b;在电商网站的商品评论中&#xff0c;需要统计评论列表中的最新评论&#xff1a;在签到打卡中&#xff0c;需要统计一个月内…

Learning to Super-resolve Dynamic Scenes for Neuromorphic Spike Camera论文笔记

摘要 脉冲相机使用了“integrate and fire”机制来生成连续的脉冲流&#xff0c;以极高的时间分辨率来记录动态光照强度。但是极高的时间分辨率导致了受限的空间分辨率&#xff0c;致使重建出的图像无法很好保留原始场景的细节。为了解决这个问题&#xff0c;这篇文章提出了Sp…