如何在整数范围内找到不同的数字集数?

时间:2010-04-07 12:32:08

标签: algorithm math

假设我有一个无符号整数,将其称为低,另一个称之为高,使得高>低。 问题是在此范围内找到不同的数字集编号。 例如,假设low为1而high为20则答案为20,因为此范围内的所有数字都是不同的数字集。如果假设低是1而高是21,则答案是20,因为12和21具有相同的数字集ie1,2。我不是在寻找暴力算法。如果有人有更好的解决方案那么通常的暴力方法,请告诉..

3 个答案:

答案 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]并将数字放在这个范围内,取决于它们的数字:

  • “121” - >设置“112”
  • “122” - >设置“122”
  • “211” - >设置“112”

我们想知道将包含唯一元素的集合数。

我建议最简单的方法就是......这样做。

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)