Сложность: medium
Дан указатель на начало односвязного списка и два целых числа left и right, где left <= right. Необходимо перевернуть узлы списка, начиная с позиции left и заканчивая позицией right, и вернуть измененный список.
Пример:
Input: ip = "255.0.0.7", n = 10
Output: ["255.0.0.7/32","255.0.0.8/29","255.0.0.16/32"]
👨💻 Алгоритм:
1⃣Преобразовать начальный IP-адрес в целое число.
2⃣Пока количество оставшихся IP-адресов n больше нуля: Определить наибольший блок, который начинается с текущего IP-адреса и не превышает количество оставшихся IP-адресов. Добавить этот блок к результату. Увеличить текущий IP-адрес на размер блока. Уменьшить количество оставшихся IP-адресов n.
3⃣Преобразовать блоки обратно в формат CIDR и вернуть их.
😎 Решение:
public class Solution {
private int ipToInt(String ip) {
String[] parts = ip.split("\\.");
return (Integer.parseInt(parts[0]) << 24) + (Integer.parseInt(parts[1]) << 16) +
(Integer.parseInt(parts[2]) << 8) + Integer.parseInt(parts[3]);
}
private String intToIp(int num) {
return String.format("%d.%d.%d.%d", (num >> 24) & 255, (num >> 16) & 255, (num >> 8) & 255, num & 255);
}
private String cidr(String ip, int prefixLength) {
return ip + "/" + prefixLength;
}
public List<String> findCidrBlocks(String startIp, int n) {
int start = ipToInt(startIp);
List<String> result = new ArrayList<>();
while (n > 0) {
int maxSize = 1;
while (maxSize <= start && maxSize <= n) {
maxSize <<= 1;
}
maxSize >>= 1;
while (start % maxSize != 0) {
maxSize >>= 1;
}
result.add(cidr(intToIp(start), 32 - Integer.bitCount(maxSize - 1) + 1));
start += maxSize;
n -= maxSize;
}
return result;
}
}Ставь 👍 и забирай 📚 Базу знаний