2009-12-22 2 views
1

Учитывая, что строка чисел говорит «5556778» и число N (скажем 2), измените строку таким образом, чтобы числа в любом непрерывном блоке размером N были уникальными. например: для вышеуказанной строки и N = 2, одна перестановка может быть 5657578.Устройте номера так, чтобы числа в блоке были уникальными.

При N = 3: 5765785

найти расположение в линейном времени.

+2

Звучит как домашнее задание .. – MindStalker

+0

Интересно, что тег Homework был добавлен, а затем удален. –

+0

домашняя работа была добавлена ​​по ошибке. В интервью кому-то был задан этот вопрос. – user237080

ответ

0

Имеет ли [Длина строки]/N целое число? Или может число элементов в последнем «Блоке»! = N?

Я хотел бы сделать список массивов, каждый массив инициализируется размером N.

перебирает строки, добавляя каждый номер к следующему доступному блоку, который уже не содержит это число. Продолжайте, пока вы не закончите.

Может быть цикл while или может быть рекурсивной функцией, я оставлю детали реализации до вас.

EDIT: ОК, на основе новой информации, что блоки не разделены, это, кажется, гораздо больше, как алгоритм сортировки модифицированной.

+0

Предположим, что большой N имеет довольно случайное распределение. Чтобы найти следующее ведро, вам нужно выполнить поиск по всем текущим ковшим, чтобы найти первое невозвращение данного символа. Разве это не сделает алгоритм в n^2 раза? –

+0

есть отдельные блоки.По блоку размера 3 означает, что если я принимаю любые 3 смежных числа в строке результата, любое из этих чисел не повторяется. Подумайте, как механизм сдвижного окна в TCP. В любой позиции окна размера N номера в окне уникальны. Таким образом, [String Len]/N может быть любой. – user237080

+0

Исправление: нет ОТДЕЛЬНЫХ блоков – user237080

1

Возможно, это похоже на ведро сортировки? Создайте список для каждой цифры, и когда вы столкнетесь с каждым номером, добавьте его в соответствующий список цифр.

Теперь приступите к созданию списков размера N из 10 ведер, которые вы создали, потянув из верхней части каждого списка цифр. Если str.length() % N == 0, то этот алгоритм преуспевает, когда используются все цифры. Вам нужно в особых случаях ситуации, когда это не так, но остальное должно быть тривиально.

+0

Я собираюсь попытаться построить решение, чтобы быстро разобраться в особых случаях. –

+0

Кроме того, не используйте список списков. Используйте список счетчиков цифр. –

+0

3445 N = 2 - как выглядят ваши списки? Похоже, что это сгенерировало: 3,4 4,5, что не получилось из-за 4,4 - но я могу вас неправильно понять. – James

0

O жаркое решение O (nk) (n = размер ввода, k = основание ваших цифр), основанный на ответе Стефана Кендалла выше, но с пониманием, что вы, вероятно, должны быть жадными и использовать целое число, у вас больше всего первый. Я не уверен, что он работает на всех входах, но я изо всех сил пытался подумать о примере, где жадность потерпит неудачу, и еще не нашел его. Предупреждение: 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 

Helper, который делает всю работу - цикл по графам, найти один с максимальным числом повторений слева, который можно использовать, и выберите Это. Повторение.

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) 

Я чувствую, что там, наверное, контрпример, что это не поможет, но я не могу думать об одном.

Смежные вопросы