解决leetcode第3704题统计和为N的无零数对
3704. 统计和为 N 的无零数对
难度:困难
问题描述:
一个 无零 整数是一个十进制表示中 不包含数字 0 的 正 整数。
给定一个整数 n,计算满足以下条件的数对 (a, b) 的数量:
a 和 b 都是 无零 整数。
a + b = n
返回一个整数,表示此类数对的数量。
示例 1:
输入: n = 2
输出: 1
解释:
唯一的数对是 (1, 1)。
示例 2:
输入: n = 3
输出: 2
解释:
数对有 (1, 2) 和 (2, 1)。
示例 3:
输入: n = 11
输出: 8
解释:
数对有 (2, 9)、(3, 8)、(4, 7)、(5, 6)、(6, 5)、(7, 4)、(8, 3) 和 (9, 2)。请注意,(1, 10) 和 (10, 1) 不满足条件,因为 10 在其十进制表示中包含 0。
提示:
2 <= n <= 1015
问题分析:
这个问题首先要解决如何判断一个整数是一个无零整数,为此设计函数check_no_zero_num(n),其功能是检查输入的整数n是否是一个无零整数,如果是则返回True,否则返回False。
之后用枚举算法从1开始生成整数对[1,n-1]、[2,n-2]、[3,n-3]......一直到[n-1,1],并检查每一个整数对是否是符合条件的无零整数对,如果是,则添加到相应的列表中,这一功能由函数get_no_zero_num_pairs(n)实现。
最后主程序输出有哪些符合条件的无零整数对,并输出其个数。
程序如下:
#检查整数n是否是一个无零整数,如果是返回True,否则返回False
def check_no_zero_num(n):n=str(n)return True if '0' not in n else False#对于整数n,返回从1到n-1的所有无零整数对的列表
def get_no_zero_num_pairs(n):t=[]for i in range(1,n):a=ib=n-aif check_no_zero_num(a) and check_no_zero_num(b):t.append([a,b])return t#主程序
n=int(input('pls input n='))
k=get_no_zero_num_pairs(n)
print('所有无零数对有:',k)
print('与',n,'相关的无零数对共有',len(k),'个')
运行实例一
pls input n=5
所有无零数对有: [[1, 4], [2, 3], [3, 2], [4, 1]]
与 5 相关的无零数对共有 4 个
运行实例二
pls input n=10
所有无零数对有: [[1, 9], [2, 8], [3, 7], [4, 6], [5, 5], [6, 4], [7, 3], [8, 2], [9, 1]]
与 10 相关的无零数对共有 9 个
运行实例三
pls input n=15
所有无零数对有: [[1, 14], [2, 13], [3, 12], [4, 11], [6, 9], [7, 8], [8, 7], [9, 6], [11, 4], [12, 3], [13, 2], [14, 1]]
与 15 相关的无零数对共有 12 个
这个题或许是因为python对字符串的处理十分灵活方便,所以显得不是很难,这也正是python的长处。