Переберите длины первых трёх октетов от 1 до 3; четвёртый — оставшийся суффикс. Каждый октет должен иметь длину 1–3, значение ≤255 и не содержать ведущего нуля.
Генерация всех корректных IP‑адресов из последовательности цифр
Переберите длины первых трёх октетов от 1 до 3; четвёртый — оставшийся суффикс. Каждый октет должен иметь длину 1–3, значение ≤255 и не содержать ведущего нуля.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дана строка s, состоящая исключительно из цифр. Необходимо получить список всех возможных валидных IP‑адресов, которые можно сформировать, разместив в строке три точки.
Порядок цифр сохраняется, перестановка запрещена. Каждый из четырёх октетов IP‑адреса должен быть числом в диапазоне от 0 до 255, записанным без ведущих нулей (за исключением самого нуля).
Пример 1 Ввод: "25525511135" Вывод: ["255.255.11.135", "255.255.111.35"]
Пример 2 Ввод: "0000" Вывод: ["0.0.0.0"]
Ответ
Переберите длины первых трёх октетов от 1 до 3; четвёртый — оставшийся суффикс. Каждый октет должен иметь длину 1–3, значение ≤255 и не содержать ведущего нуля.
static List<String> restoreIpAddresses(String s) {
List<String> out = new ArrayList<>();
if (s.length() < 4 || s.length() > 12) return out;
for (int a = 1; a <= 3; a++)
for (int b = 1; b <= 3; b++)
for (int c = 1; c <= 3; c++) {
int d = s.length() - a - b - c;
if (d < 1 || d > 3) continue;
String[] parts = {s.substring(0, a), s.substring(a, a+b),
s.substring(a+b, a+b+c), s.substring(a+b+c)};
boolean valid = true;
for (String part : parts)
if ((part.length() > 1 && part.charAt(0) == '0')
|| Integer.parseInt(part) > 255) valid = false;
if (valid) out.add(String.join(".", parts));
}
return out;
}
Импорты List/ArrayList из java.util. Условие гарантирует только цифры, поэтому parseInt безопасен для короткого октета. Проверяется не более 27 вариантов границ.