一、编程题目
python找出所有重复数字的三位数(如110)注意重复数字(如111除外) 要求打印所有满足条件的三位数及个数,每行打印五个。
二、实现思路
要实现判断数字是否重复,脑袋里的第一反应就是使用循环,当时数字本身是不能循环的,因此需要将数字转为字符串,然后将字符串当成字符串数组进行循环,而且需要使用到双层循环,因为需要判断数字中的每一位是否跟数字中的其他位有重复,取数字中的每一位需要一个循环,跟数字中的其他位比较时,需要一个循环。
还有一种实现思路就是,利用列表的count方法,可以计算某位元素在列表中的数量,从而判断是数字中是否有重复数字,某位数字的数量为2说明该数字中有重复数字,注意题目要求三位相同的数字除外。
最后一种实现思路就是使用集合set的概念,我们都知道集合中是不能存在重复元素的,因此我们可以将字符串转为集合,由于集合不允许存在重复的元素,集合会自动把重复的元素去掉。因此,如果之后集合的大小和之前的大小是一样的,说明没有重复元素,如果小于之前的大小,说明存在重复元素。这是最简答的一种方法。
三、代码实现
1、基于以上分析的第一种思路,使用双层循环实现
def is_repeat(num):
num = str(num)
count = 1 #记录重复次数
for i in range(len(num)):
for j in range(i+1,len(num)):
if num[i] == num[j]:
count+=1
if count==2:
return True
else:
return False
以上定义了一个判断是否有重复数字的函数,其中定义了一个count变量,目的就是为了统计重复数字的个数,因为题目要求不能三个数字重复,所以当count的值为2也就表示有2个数字重复了。
2、基于以上分析的第二种思路,使用列表的count方法实现。 此时只需要一个循环即可
def is_repeat(num):
num = str(num)
for i in range(len(num)):
if num.count(num[i])==2:
return True
break
else:
return False
其中使用到for else语句结构。当for循环中没有执行break语句则执行else部分的代码,否则不执行else部分的代码。
3、基于第三种思路实现,利用集合去重的功能,判断去重前后字符串长度的变化来判断是否有数字重复。
def is_repeat(num):
num = list(str(num))#转为字符串类型的列表
numset = set(num)#由列表转set ,set遇到重复的数字会自动去重
if len(num)-len(numset)==1: #如果去重后的字符串长度比去重前的长度少一位,表示有2个数字重复
return True
else:
return False
如果去重后的字符串长度比去重前的长度少一位,表示有2个数字重复,刚好去掉了一个重复的,所以长度相差1。 哈哈,怎么样,发现这个方法是最简单了吧。所以在写程序前一定要先思考再动手。
4、主函数,调用之前的方法,循环判断所有的三位数是否有重复数字,有的话就打印出来,5个一行
if __name__ == '__main__':
count = 0 # 计数器,用于每行打印五个数字
for n in range(100,1000):
if is_repeat(n):
print(n, end=' ')
count += 1
if count % 5 == 0: # 每行打印五个数字
print()