1+ import java .util .ArrayList ;
2+ import java .util .List ;
3+
4+ public class Solution751 {
5+ public List <String > ipToCIDR (String ip , int n ) {
6+ List <String > resList = new ArrayList <>();
7+ long start = ip2Long (ip );
8+ for (int i = 0 , mod ; i < n ; i += mod ) {
9+ mod = 1 ;
10+ long cur = start + i ;
11+ while (true ) {
12+ if (i + mod > n || cur % mod != 0 ) {
13+ mod >>= 1 ;
14+ break ;
15+ }
16+ mod <<= 1 ;
17+ }
18+ // 黑科技
19+ // https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Integer.html#numberOfLeadingZeros(int)
20+ // floor(log2(x)) = 31 - numberOfLeadingZeros(x)
21+ // ceil(log2(x)) = 32 - numberOfLeadingZeros(x - 1)
22+ int floorLog2x = 31 - Integer .numberOfLeadingZeros (mod );
23+ String res = long2Ip (cur ) + "/" + (32 - floorLog2x );
24+ resList .add (res );
25+ }
26+ return resList ;
27+ }
28+
29+ private long ip2Long (String ip ) {
30+ long res = 0 ;
31+ for (String x : ip .split ("\\ ." )) {
32+ res = (res << 8 ) + Integer .parseInt (x );
33+ }
34+ return res ;
35+ }
36+
37+ private String long2Ip (long x ) {
38+ return (x >> 24 ) + "." + (x >> 16 ) % 256 + "." + (x >> 8 ) % 256 + "." + (x % 256 );
39+ }
40+ }
41+ /*
42+ $751. IP 到 CIDR
43+ https://leetcode.cn/problems/ip-to-cidr/
44+
45+ IP地址 是一个格式化的 32位 无符号整数,每组 8位 被打印为一个十进制数字和,点字符 '.' 起到了分组的作用。
46+ - 例如,二进制数 00001111 10001000 11111111 01101011 ( 为清晰起见增加了空格)被格式化为IP地址将是 “15.136.255.107” 。
47+ CIDR块 是一种用来表示一组特定IP地址的格式。字符串形式,由基础IP地址、斜杠和前缀长度 k 组成。它所覆盖的地址是所有IP地址的 前 k 位 与基础IP地址相同的IP地址。
48+ - 例如, “123.45.67.89/20” 是一个前缀长度为 20 的 CIDR块。任何二进制表示形式匹配 01111011 00101101 0100xxxx xxxxxxxx 的IP地址,其中 x 可以是 0 或 1 ,都在CIDR块覆盖的集合中。
49+ 给你一个起始IP地址 ip 和我们需要覆盖的IP地址数量 n 。你的目标是使用 尽可能少的CIDR块 来 覆盖范围 [ip, ip + n - 1] 内的所有IP地址 。不应该覆盖范围之外的其他IP地址。
50+ 返回 包含IP地址范围的 CIDR块 的 最短 列表。如果有多个答案,返回其中 任何 一个 。
51+ 提示:
52+ 7 <= ip.length <= 15
53+ ip 是一个有效的 IPv4 ,形式为 "a.b.c.d" ,其中 a, b, c, d 是 [0, 255] 范围内的整数
54+ 1 <= n <= 1000
55+ 每个隐含地址 ip + x ( x < n) 都是有效的 IPv4 地址
56+
57+ 求log2(x)黑科技
58+ 相似题目: 1483. 树节点的第 K 个祖先
59+ https://leetcode.cn/problems/kth-ancestor-of-a-tree-node/
60+ */
0 commit comments