排列数字,使得块中的数字是唯一的

时间:2009-12-22 18:34:55

标签: algorithm data-structures

给定一串数字表示“5556778”和数字N(比如2),重新排列字符串,使得任何大小为N的连续块中的数字都是唯一的。 例如:对于上面的字符串和N = 2,一次重新排列可以是5657578。

对于N = 3:5765785

在线性时间内找到排列。

3 个答案:

答案 0 :(得分:1)

也许这就像斗式排序?为每个数字创建一个列表,当您遇到每个数字时,将其添加到相应的数字列表中。

现在,从每个数字列表的顶部开始,从您创建的10个桶中开始构建大小为N的列表。如果str.length() % N == 0,则在使用所有数字时此算法成功。你需要特殊情况下这是不正确的情况,但其余的应该是微不足道的。

答案 1 :(得分:0)

[String length] / N总是等于整数吗?或者最后一个“Block”中的元素数量是多少!= N?

我会列出一个数组列表,每个数组的初始化大小为N。

遍历字符串,将每个数字添加到下一个尚未包含该数字的可用块中。继续,直到你完成。

可能是一个while循环,或者可能是一个递归函数,我将把实现细节留给你。

修改 好的,根据新的信息,块不是分开的,这看起来更像是一个修改过的排序算法。

答案 2 :(得分:0)

O(nk)贪婪的解决方案(n =输入大小,k =你的数字的基数),基于Stefan Kendall上面的回答,但是你应该贪婪并且使用你最常用的整数。我不是肯定它适用于所有输入,但我绞尽脑汁试图想出一个反例,贪婪会在这里失败,还没有找到。警告:前面的cruddy python - 我这样做很快,很脏,不漂亮。

检查在给定当前状态的情况下是否可以使用数字:

   def ok(s, n, v):
       l = len(s)
       if l < n:
           n = l
       if n < 1:
           return True
       if str(v) in s[-n:]:
           return False
       return True

执行所有工作的助手 - 遍历计数,找到剩余可重复的最大重复次数的那个,然后选择它。重复。

   def go(counts, n):
       output = ""
       max = 0
       more = True

       while max >= 0:
         max = -1
         pos = -1
         more = False
         for i in range(10):
             if counts[i] > 0:
                 more = True
             if counts[i] > max and counts[i] > 0 and ok(output, n, i):
                 max = counts[i]
                 pos = i
         if max < 0:
             if more:
                 return "No solution"
             return output
         counts[pos] = counts[pos] - 1
         output = output + str(pos)

主要功能:

   def blockify(s, fold):
       counts = [0,0,0,0,0,0,0,0,0,0]
       for letter in s:
         counts[int(letter)] = counts[int(letter)] +1
       return go(counts, fold)

我觉得这可能是一个反例,但这个失败了,但我想不到一个。