📅  最后修改于: 2023-12-03 15:06:40.446000             🧑  作者: Mango
在这个问题中,我们需要计算范围[L,R]内以任意给定数字结尾的数字数量。这里我们提供两种解决问题的方法:一种是暴力枚举法,一种是数学规律法。
暴力枚举法是最基本的解决方法。我们可以遍历范围[L,R]中的每一个数字,判断它的个位数是否与所给定数字相同。如果相同,则计数器加一。
代码实现如下:
def count_numbers_ending_with_given_digit(L, R, digit):
count = 0
for num in range(L, R+1):
if num % 10 == digit:
count += 1
return count
复杂度分析:时间复杂度为O(R-L),空间复杂度为O(1)。该方法比较简单,但是当范围较大时,时间效率较低。
通过观察可以发现,以任意给定数字结尾的数字是呈现一定规律的。例如,以4结尾的数字在数轴上会呈现4、14、24、34、……、L+4、L+14、……等等。可以发现,它们之间的差距是10的倍数。因此,我们只需要计算范围内有多少个10的倍数,即可得到以4结尾的数字的个数。同理,以其他数字结尾的数字也可以采用类似的方法进行计算。
代码实现如下:
def count_numbers_ending_with_given_digit(L, R, digit):
count = (R - L) // 10
if L % 10 + count * 10 <= R and L % 10 <= digit:
count += 1
return count
复杂度分析:时间复杂度为O(1),空间复杂度为O(1)。该方法的时间效率比暴力枚举法高,尤其是当范围较大时,可以大大降低运行时间。