给定一串数字表示“5556778”和数字N(比如2),重新排列字符串,使得任何大小为N的连续块中的数字都是唯一的。 例如:对于上面的字符串和N = 2,一次重新排列可以是5657578。
对于N = 3:5765785
在线性时间内找到排列。
答案 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)
我觉得这可能是一个反例,但这个失败了,但我想不到一个。