刷题打卡之量化数字的统计| 豆包MarsCode AI 刷题

171 阅读3分钟

问题描述

小M最近对一种特别的数字产生了兴趣。他称某个数字为“量化数字”,当且仅当这个数字满足以下两个条件:

  1. 该数字能被3整除。
  2. 该数字的所有位数都是相同的数字。 例如,数字666是一个量化数字,因为它能被3整除,并且所有位数都是6

现在给定两个整数LR,你需要统计在LR范围内(包括LR)的所有量化数字,并返回这个数字的个数。

测试样例

样例1:

输入:L = 5, R = 125
输出:6

样例2:

输入:L = 10, R = 300
输出:5

样例3:

输入:L = 100, R = 999
输出:9

解题思路

看到这道题我的第一反应就是暴力求解,先怎么简单怎么来嘛,毕竟脑细胞能省一点是一点啊,不省白不省嘛。说干就干,直接遍历L到R的每一个数并进行判断,写完运行,很好,样例通过,点击提交,这下不好了,超时了。眼瞅这道题只靠蛮力是不行了,那只能耗点脑细胞上计谋呗。计谋如下:

让我们重新回到问题中,题目中给了两个条件,这里我们侧重看条件2(“该数字的所有位数都是相同的数字”),如1,2,11,22,111,222,1111,2222 等等,此外,我们可以轻易发现在每一个数量级中只有九个所有位数数字都相同的整数(全部分别由1-9构成)。因为“量化数字”只会出现在这些整数中,那么我们就没必要遍历区间内的所有整数,只需看每个数量级内的这九个整数能否被3整除即可找出区间内的全部“量化数字”。好了,目前为止我们已经有了解题的大致思路,接下来就码呗。

代码实现

def solution(L: int, R: int) -> int:
    l_length = len(str(L))
    r_length = len(str(R))
    num = 0
    if l_length==r_length:
        for i in range(int(str(L)[0]),int(str(R)[0])+1):
            if i*l_length%3==0 and L<= int(i*int('1'*l_length))<=R:
                num+=1
    else:
        for n in range(l_length,r_length+1):
            if n==l_length:
                for i in range(int(str(L)[0]),10):
                    if i*n%3==0 and int(i*int('1'*n))>=L:
                        num+=1
            elif n==r_length:
                for i in range(1,int(str(R)[0])+1):
                    if i*n%3==0 and int(i*int('1'*n))<=R:
                        num+=1
            else:
                for i in range(1,10):
                    if i*n%3==0:
                        num+=1
    return num

1,先将L和R转换成字符串并求出其长度来确定L和R所处的数量级

2,创建变量num用记录“量化数字”的个数

3,判断L和R所处的数量级并进行相应处理(需要特别注意L和R所处的数量级,不能和其他数量级一样从1-9进行遍历)

4,写完提交,很好,运行通过

image.png

笔记到此结束,大家可以思考一下这种方法究竟比暴力法快了多少呢?