Предположим, что у меня есть целое число без знака, назовите его низко и друг друга, назовите его высоким, чтобы высокий> низкий. Проблема заключается в том, чтобы найти различные цифры цифр в этом диапазоне. Например, допустим, что low равен 1, а высокий - 20, тогда ответ равен 20, потому что все числа в этом диапазоне имеют разные наборы цифр. Если предположить, что низкий - 1, а высокий - 21, тогда ответ равен 20, потому что 12 и 21 имеют одинаковый набор цифр, т.е. 1, 2. Я не ищу алгоритм bruteforce. Если у кого-то есть лучшее решение, тогда обычный подход с грубой силой , пожалуйста, сообщите ..как найти различные цифры цифр в диапазоне целых чисел?
ответ
Там, очевидно, представляет собой математический ответ на этот вопрос, хотя я признаю, что я не работал его пока еще нет.
Проще говоря, если низкий уровень = 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. Но все же это начало, я буду думать дальше.
Ваши примеры ... странные. Я думаю, вы перепутались на диапазонах. '10-19' =' {10, 11, 12, 13, 14, 15, 16, 17, 18, 19} ', что дает 10 уникальных номеров. Вы имели в виду, что у '0-19' будет только' 9' больше чисел, чем '0-9'? –
@Matthieu - во втором примере я предлагал включить в себя начальный ноль. Таким образом, 01 и 10 являются одинаковыми. – ChrisBD
Может быть, это поможет вам начать работу: mathematic combinations
http://www.codeguru.com/cpp/cpp/algorithms/combinations/article.php/c5117
Я не думаю, что это поможет. Если все идет правильно, я хочу знать, как это сделать? –
Вы после алгоритма или кода для этого? К сожалению, неправильное место для моего комментария. – ChrisBD
Я думаю, что я, наконец, обернутый вокруг моей головы проблемы.
Давайте диапазон [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
Хорошо, это перебор, но, по крайней мере, все должны быть на той же странице теперь :)
Я уже реализовал это, но что, если диапазон составляет от 1 до 10 миллиардов. Как много наборов есть? Я ожидал, что кто-то найдет для себя какую-то математическую серию. –
Они могут, я просто написал это, чтобы было легче для любого, кто придумал что-то еще, чтобы проверить его результат. –
Спасибо Matthieu, теперь я лучше понимаю вопрос (но до сих пор я понятия не имею, как принести сложность под O (high-low)) –
- 1. Обратные цифры целых чисел
- 2. Сравнение цифр целых чисел
- 3. Как суммировать цифры целых чисел
- 4. Найти сумму цифр последовательности целых чисел
- 5. Найти число целых чисел в диапазоне
- 6. Найти цифры максимального числа в диапазоне простых чисел
- 7. Подсчет целых чисел в диапазоне
- 8. Множественность целых чисел в диапазоне
- 9. Как распечатать цифры целых чисел любой длины?
- 10. Извлечение цифр из целых чисел в C?
- 11. Найти инкрементный х количество цифр в диапазоне
- 12. Как оптимизировать код ruby итерации нескольких целых чисел в диапазоне?
- 13. Найти числа больших чисел (~ 8000 цифр) в заданном диапазоне
- 14. Pascal: сумма цифр в диапазоне
- 15. Как суммировать цифры двух целых чисел?
- 16. Как найти повторяющуюся последовательность целых чисел в массиве целых чисел?
- 17. Разделение цифр числа в массив целых чисел
- 18. переменная предварительная оценка в диапазоне целых чисел
- 19. Преобразование целых чисел в римские цифры (python)
- 20. Как сравнить разные позиции цифр двух целых чисел?
- 21. Создайте массив целых чисел, используя цифры как размер
- 22. Найти коэффициенты целых чисел
- 23. Сравнение цифр двух целых чисел в каждой десятичной позиции
- 24. Деление целых чисел в массивах на отдельные цифры
- 25. Сопоставление целых чисел во всем диапазоне
- 26. перебирать цифры целых чисел внутри массива
- 27. Получение количество цифр неотрицательных целых чисел (Python)
- 28. Регулярное выражение для целых чисел 7-12 цифр
- 29. Как найти список целых чисел в Haskell
- 30. Как найти уникальные цифры в заданном диапазоне массивов эффективно?
Что именно вы ищете? Максимум n <= высокий, где все числа в интервале [low, n] имеют разные цифры? Или вы хотите получить максимальный размер произвольного подмножества [low, high] с этим свойством? Или что-то другое? –
Я хочу иметь точное количество таких чисел между низким и высоким. –
Вы используете алгоритм или код для этого? – ChrisBD