一个整数如果由相同的数字构成,则称为完美整数。例如: 1、11、333 是完美整数。 12、19、101 是不完美整数。 现在,你需要计算给定区间 [x, y] 中有多少个整数是完美整数。 测试样例 样例1: 输入:x = 1 ,y = 10
学习笔记:完美整数的判断与区间筛选
一、问题分析
题目要求我们计算一个给定区间 [x, y]
中有多少个完美整数。一个整数被称为完美整数,如果它由相同的数字组成。例如:
- 完美整数:1、11、333。
- 不完美整数:12、19、101。
完美整数的特征是它由同一个数字重复组成,比如 1
、11
、222
等。而不完美整数则是由不同的数字组合而成,比如 12
、19
、101
等。
我们的目标是通过判断区间 [x, y]
中的每个整数是否是完美整数,统计出符合条件的整数个数。
二、如何判断一个整数是否为完美整数?
判断一个整数是否是完美整数,可以通过以下步骤:
- 将数字转换为字符串:将整数转换为字符串,方便检查每一位数字。
- 判断字符是否相同:将字符串中的所有字符放入一个集合中,集合中的元素个数为1时,说明该整数是完美整数。因为集合中的重复元素会被去除,所以如果集合的大小为1,表示所有字符都相同。
例如:
111
-> 转换为字符串'111'
,集合为{'1'}
,大小为1,说明是完美整数。121
-> 转换为字符串'121'
,集合为{'1', '2'}
,大小大于1,说明不是完美整数。
三、解决方案
为了解决这个问题,我们可以遍历区间 [x, y]
中的每个整数,检查它是否是完美整数。如果是,则计数加一。最终输出计数结果。
- 遍历区间:从
x
到y
逐一检查每个整数。 - 判断完美整数:对于每个整数,转换为字符串并检查是否所有字符相同。
- 输出结果:统计满足条件的整数数量并返回。
四、代码实现
def solution(x, y):
count = 0
for num in range(x, y + 1):
# 将数字转换为字符串,判断是否所有字符相同
if len(set(str(num))) == 1:
count += 1
return count
# 测试样例
if __name__ == "__main__":
print(solution(1, 10) == 9) # 完美整数:1, 2, ..., 9(共9个)
print(solution(2, 22) == 10) # 完美整数:2, 3, ..., 9, 11, 22(共10个)
五、代码解释
-
初始化计数器:
count = 0
。我们使用count
来统计完美整数的数量。 -
遍历区间:使用
for num in range(x, y + 1)
遍历区间[x, y]
中的每个整数。 -
判断完美整数:通过
set(str(num))
将当前数字转换为字符串并放入集合。若集合的长度为1,则说明数字的每一位都是相同的,即为完美整数。set(str(num))
:将数字转换为字符串,然后转换为集合,集合中的元素是去重后的数字字符。如果集合的大小为1,说明所有数字字符相同。
-
更新计数器:如果当前数字是完美整数,则将计数器
count
加1。 -
返回结果:最终返回
count
,即区间内完美整数的个数。
六、复杂度分析
-
时间复杂度:
- 遍历区间
[x, y]
中的每个整数,区间的大小为y - x + 1
。 - 对于每个整数,我们将其转换为字符串并判断其字符是否相同。这个操作的时间复杂度是
O(d)
,其中d
是数字的位数。对于大多数整数来说,d
的最大值是一个常数,因此可以认为时间复杂度是O(1)
。 - 因此,总的时间复杂度是
O(n)
,其中n
是区间[x, y]
的大小,即y - x + 1
。
- 遍历区间
-
空间复杂度:
- 我们只使用了
set
来存储每个数字的字符,空间复杂度是O(d)
,其中d
是数字的位数。对于大多数情况来说,d
是一个常数,因此空间复杂度可以视为O(1)
。
- 我们只使用了
七、优化思考
目前的解法已经相对简单直接,且能够满足常见的区间范围。我们可以通过以下几种方式进一步优化:
-
直接生成完美整数:
- 完美整数的形式通常是由一个数字重复组成的。我们可以事先生成所有可能的完美整数,比如
1, 2, 3, ..., 9, 11, 22, 33, ..., 99
等,并直接在区间[x, y]
中查找这些完美整数是否存在。这种方式适用于给定范围较小或需要频繁查询的情况。
- 完美整数的形式通常是由一个数字重复组成的。我们可以事先生成所有可能的完美整数,比如
-
避免重复判断:
- 如果区间非常大,我们可以采用一些数学性质或更高效的数据结构(如位图)来避免重复计算,从而提升效率。