假设我有一个无符号整数,将其称为低,另一个称之为高,使得高>低。 问题是在此范围内找到不同的数字集编号。 例如,假设low为1而high为20则答案为20,因为此范围内的所有数字都是不同的数字集。如果假设低是1而高是21,则答案是20,因为12和21具有相同的数字集ie1,2。我不是在寻找暴力算法。如果有人有更好的解决方案那么通常的暴力方法,请告诉..
答案 0 :(得分:2)
显然有一个数学答案,虽然我承认我还没有解决这个问题。
如果低= 1且高= 99,则简单地说,我们有以下内容:
0 - 9 = 10 unique numbers
10-19 = 10 unique numbers
20-29 = 9 unique numbers
30-31 = 8 unique numbers
40-49 = 7 unique numbers
50-59 = 6 unique numbers
60-69 = 5 unique numbers
70-79 = 4 unique numbers
80-89 = 3 unique numbers
90-99 = 2 unique numbers
如果我们假设所有数字都必须具有相同的位数,那么可能更容易计算出来,并且在需要时前导零。例如01,02,03,04为1,2,3,4。这意味着01和10将匹配。 然后我们的号码分布变为:
0 - 9 = 10 unique numbers
10-19 = 9 unique numbers
20-29 = 8 unique numbers
30-31 = 7 unique numbers
40-49 = 6 unique numbers
50-59 = 5 unique numbers
60-69 = 4 unique numbers
70-79 = 3 unique numbers
80-89 = 2 unique numbers
90-99 = 1 unique numbers
您可以看到应该可以使用10的因子来建立递归公式,以确定可能有多少个唯一数字。 困难在于如何处理变量的起点和终点,例如:低= 25,高= 87。 这仍然是一个开始,我会进一步思考它。
答案 1 :(得分:1)
我想我终于解决了这个问题。
我们取范围[low,high]
并将数字放在这个范围内,取决于它们的数字:
我们想知道将包含唯一元素的集合数。
我建议最简单的方法就是......这样做。
def rangeCount(low, high):
sets = defaultdict(list)
for i in range(low, high+1):
key = `i`.sort() # obtain digits and sort them
sets[key].append(i)
count = 0
for v in sets.values():
if len(v) == 1: count = count + 1
return count
好吧,这是暴力,但现在至少每个人都应该在同一个页面上:)
答案 2 :(得分:0)