2010-04-07 2 views
3

Предположим, что у меня есть целое число без знака, назовите его низко и друг друга, назовите его высоким, чтобы высокий> низкий. Проблема заключается в том, чтобы найти различные цифры цифр в этом диапазоне. Например, допустим, что low равен 1, а высокий - 20, тогда ответ равен 20, потому что все числа в этом диапазоне имеют разные наборы цифр. Если предположить, что низкий - 1, а высокий - 21, тогда ответ равен 20, потому что 12 и 21 имеют одинаковый набор цифр, т.е. 1, 2. Я не ищу алгоритм bruteforce. Если у кого-то есть лучшее решение, тогда обычный подход с грубой силой , пожалуйста, сообщите ..как найти различные цифры цифр в диапазоне целых чисел?

+1

Что именно вы ищете? Максимум n <= высокий, где все числа в интервале [low, n] имеют разные цифры? Или вы хотите получить максимальный размер произвольного подмножества [low, high] с этим свойством? Или что-то другое? –

+0

Я хочу иметь точное количество таких чисел между низким и высоким. –

+0

Вы используете алгоритм или код для этого? – ChrisBD

ответ

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. Но все же это начало, я буду думать дальше.

+0

Ваши примеры ... странные. Я думаю, вы перепутались на диапазонах. '10-19' =' {10, 11, 12, 13, 14, 15, 16, 17, 18, 19} ', что дает 10 уникальных номеров. Вы имели в виду, что у '0-19' будет только' 9' больше чисел, чем '0-9'? –

+0

@Matthieu - во втором примере я предлагал включить в себя начальный ноль. Таким образом, 01 и 10 являются одинаковыми. – ChrisBD

0

Может быть, это поможет вам начать работу: mathematic combinations

http://www.codeguru.com/cpp/cpp/algorithms/combinations/article.php/c5117

+0

Я не думаю, что это поможет. Если все идет правильно, я хочу знать, как это сделать? –

+0

Вы после алгоритма или кода для этого? К сожалению, неправильное место для моего комментария. – ChrisBD

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 

Хорошо, это перебор, но, по крайней мере, все должны быть на той же странице теперь :)

+0

Я уже реализовал это, но что, если диапазон составляет от 1 до 10 миллиардов. Как много наборов есть? Я ожидал, что кто-то найдет для себя какую-то математическую серию. –

+0

Они могут, я просто написал это, чтобы было легче для любого, кто придумал что-то еще, чтобы проверить его результат. –

+0

Спасибо Matthieu, теперь я лучше понимаю вопрос (но до сих пор я понятия не имею, как принести сложность под O (high-low)) –

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