Решение алгоритмической задачи на Python: даны два строковых представления чисел A и B. Нужно максимизировать A, выполняя замену цифр в A на цифры из B, при этом каждую цифру из B можно использовать только один раз.
Проект подходит для практики тем: алгоритмы, строки, оптимизация, greedy (жадный алгоритм), обработка краевых случаев. Формат задачи типичен для competitive programming / coding challenge / interview.
Даны два строковых представления чисел A и B. Нужно максимизировать A, заменив в нём любую цифру на цифру из B. Каждую цифру B можно использовать только один раз.
Уточнения (по твоим требованиям):
- ✅ Отрицательные числа возможны (знак
-не является цифрой и не заменяется). - ✅ Ведущие нули сохраняются (например,
"0009","-0120"). - ✅ Реализация делает несколько замен (пока не закончатся цифры в
B).
Функция main(numA: str, numB: str) -> str проходит по A слева направо и жадно делает замену, если это увеличивает результат:
-
Для положительного
A:- сортирует цифры
Bпо возрастанию и держит «самую большую доступную» в конце списка; - если текущая цифра
A[i]меньше максимальной доступной цифры изB, то заменяет на неё.
- сортирует цифры
-
Для отрицательного
A:- сортирует цифры
Bпо убыванию, и берёт «самую маленькую доступную» из конца списка; - если можно уменьшить текущую цифру (сделать её меньше), то выполняет замену — это делает число менее отрицательным (ближе к нулю).
- сортирует цифры
Дополнительно:
- если после замен все цифры стали
'0', знак-не добавляется (получается"0000", а не"-0000").
Пусть n = len(A), m = len(B).
- Время:
O(m log m + n)из‑за сортировкиBи одного прохода поA. - Память:
O(m + n)(списки цифрBи результат).
Возможная оптимизация: так как цифр всего 10 (
0..9), можно заменить сортировку на подсчёт частот (аналогCounter) и получитьO(n + m).
.
├── src/
│ └── main.py
├── tests/
│ └── test_main.py
├── .gitignore
├── .python-version
├── pyproject.toml
├── uv.lock
└── README.md
- Python 3.12+
- uv (устанавливается глобально)
Рекомендуемый путь — официальный installer от Astral (ставит uv в пользовательский PATH).
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"Проверка:
uv --versionwinget install --id=astral-sh.uv -escoop install main/uvcurl -LsSf https://astral.sh/uv/install.sh | shЕсли curl нет:
wget -qO- https://astral.sh/uv/install.sh | shПроверка:
uv --versionpipx install uvpython -m pip install -U uvВ корне репозитория:
uv syncuv run python src/main.pyuv run python .\src\main.pyuv run pytest -qfrom src.main import main
print(main("8350", "0129")) # -> "9352"from src.main import main
print(main("-8350", "0129")) # -> "-0120"Рекомендуемые темы (10–20 шт.) для поля Topics на GitHub:
- python
- uv
- algorithms
- greedy-algorithm
- strings
- digit-replacement
- maximize-number
- optimization
- competitive-programming
- coding-challenge
- interview-problem
- pytest
- unit-testing
- edge-cases
- leading-zeros
- negative-numbers