【刷题日记】728. 自除数
本次刷题日记的第 20 篇,力扣题为:728. 自除数 ,简单
一、题目描述:
补作业的最后一题,咱们来一个简单轻松的题来结束本次刷题吧,让咱们心情愉悦一点,上班带薪刷题
简单题也并不简单,很多时候看到简单题,我们总会考虑如何使用比较好的技巧来完成一道题的实现,如果没有技巧的话,我们也会使用暴力求解
二、这道题考察了什么思想?你的思路是什么?
我们还是来分析一下这道题是要给我们说些啥,可能乍一看,还会有点没看明白:
- 我们要明白自除数的定义,例如体重给出的 128 ,他是自除数,是因为他满足 128 对于 1 ,2 ,8 这 3 个数能正常的整除,满足这个条件的数,那就是自除数
- 有一点一定要注意,自除数,一定要注意不能含 0.也就是说类似于 108,120 这样的数字都是不满足自除数的
- 题目是给我们一个数据区间,我们需要筛选出这个区间内的自除数
这样看来就比较明确了,知道啥是自除数,题目需要啥,我们就想办法给他就可以了,接下来我们还是来用示例推演一下:
示例:left = 1, right = 22
拿几个数举个例子
按照上述的例子,我们其实就可以傻瓜式的对于一个数,一位一位的取看是否满足条件,若每一位数都满足条件,那么这个数字就是满足条件的
所以这个时候,我们就只需要去找题目中给出的数字,有多少是满足条件的,抠出来就可以了
三、编码
根据上述逻辑和分析,我们就可以翻译成如下代码,翻译代码的时候,需要注意数字中是否有 0 ,若是有 0 的话,那么这个数直接就不是自除数
编码如下:
// 定义一个 helper 函数,来确认给进来的数是否是自除数 func helper(num int) bool { for tmp := num; tmp>0; tmp=tmp/10 { // 获取给出数字的每一位,校验是否等于 0 ,等于0 则不符合题意, 还要校验给出的数是否可以整除他的每一位 if x:=tmp%10; x==0 || num % x !=0{ return false } } return true } func selfDividingNumbers(left int, right int) []int { res := make([]int,0) // 查看题目给出的列表中,哪些数字是符合条件的 for i:=left; i<=right; i++ { if helper(i) { res = append(res,i) } } return res }
看了上述编码,还是比较清晰的吧,编码的逻辑和推演的逻辑一致,但是我们可以看出来这是比较笨的一种方法,暴力求解,日后有比较好的技巧,我再来分享一波
四、总结:
该题的时间复杂度是 O(nlog right),这个 n 是所给区间的数量,**空间复杂度是 O(1) ,我们只引入了常数级别的空间消耗
原题地址:728. 自除数
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~