假设我有一个无符号整数,称之为low,另一个称之为high,使得high>low。
问题是在此范围内找到不同的数字集合。
例如,假设low是1,high是20,那么答案是20,因为在这个范围内的所有数字都具有不同的数字集合。如果假设low是1,high是21,则答案是20,因为12和21具有相同的数字集合,即1、2。我不是在寻找暴力算法,如果有人有比通常的暴力方法更好的解决方案,请告诉我...
显然,对于这个问题有一个数学答案,虽然我承认我还没有算出来。
简单地说,如果low = 1且high = 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
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-19
= {10, 11, 12, 13, 14, 15, 16, 17, 18, 19}
,这给出了10个独特的数字。你是不是想说 0-19
只比 0-9
多了 9
个数字? - Matthieu M.我想我终于理解了这个问题。
让我们取范围 [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
好的,这是暴力破解,但至少现在每个人都应该在同一页上了 :)