|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 zltzlt 于 2020-1-18 21:25 编辑
今天的题目:
给定正整数 n,返回小于等于 n 且具有至少 1 位重复数字的正整数的个数。
示例 1:
输入:20
输出:1
解释:具有至少 1 位重复数字的正数(<= 20)只有 11。 示例 2:
输入:100
输出:10
解释:具有至少 1 位重复数字的正数(<= 100)有 11,22,33,44,55,66,77,88,99 和 100。
 欢迎大家一起答题! 
本帖最后由 TJBEST 于 2020-1-19 15:34 编辑
又写了一个长代码,不知道速率如何
- def fun309(n):
- def splitNum(n):
- res = []
- while n:
- re = n % 10
- n = n // 10
- res.append(re)
- return list(reversed(res))
- def ByNine(index):
- res = 9
- for k in range(0,index):
- res= res * (9 - k)
- return res
- def MulByall(start,end):#start >= end <表示 到个位了
- res = 1
- for i in range(end , start + 1):
- res = res * i
- return res
- def firstNum(num,arr):
- res = 0
- for i in range(0,num):
- if i not in arr:
- res = res + 1
- return res
-
- NotHave_Nine = [9]#常数 <= 999..999 的不重复个数
- for i in range(1,10):
- temp = NotHave_Nine[len(NotHave_Nine) - 1] + ByNine(i)
- NotHave_Nine.append(temp)
- numList = splitNum(n)
- N = len(numList)#位数
- if N == 1:
- return 0
- if N >= 11:
- return n - NotHave_Nine[9]
- arr = []#记录已处理的数
- isnot = NotHave_Nine[N - 2]
-
- if numList[0] == 1:
- arr.append(1)
- else:
- isnot += (numList[0] - 1) * MulByall(9,11 - N)
- arr.append(numList[0])
-
- state = 1
- for i in range(1,N - 1):
- temp = numList[i]
- isnot += firstNum(temp,arr) * MulByall(9 - i,11 - N)
- if temp in arr:
- state = 0
- break
- else:
- arr.append(temp)
- if state == 1:
- isnot += firstNum(numList[N - 1] + 1,arr)
- else:
- pass
- return n - isnot
复制代码
|
|