题目如下:
解题思路:题目要求出至少有一个重复元素的数字的总数,我们可以先求没有重复元素的数字的总数,再用N减去这个总数即可。怎么求出没有重复元素的数字的个数呢?假设Input = 53254,首先求出位数小于Input时满足条件的数字总数
位数等于Input时的情况会麻烦一些。我的方法是首先求以5XXXX这种格式的总数,然后再求出53XXX这种格式的总数,直到最后求出总数。
代码如下:
class Solution(object): def numDupDigitsAtMostN(self, N): """ :type N: int :rtype: int """ def calcPerm(v1,v2): v = 1 while v1 > 0: v *= v2 v2 -= 1 v1 -= 1 return v ln = list(str(N)) res = 1 if len(list(str(N))) == len(set(list(str(N)))) else 0 #判断N是否包含重复元素 dic_used = [int(ln[0])] for i in range(1,len(ln)): count = 0 for j in range(0,int(ln[i])): if j not in dic_used: count += 1 res += count * calcPerm(len(ln) - i - 1, 10 - i - 1) if int(ln[i]) in dic_used: break dic_used.append(int(ln[i])) # for i in range(1,len(ln)+1): if i != len(ln): res += (9 * calcPerm(i-1,9)) else: count = int(ln[0]) - 1 res += (count * calcPerm(i - 1, 9)) # return N - res