2021-09-02:IP 到 CIDR。给定起始IP和整数n,返回长度最小的CIDR块。力扣751。比如:ip=255.0.0.7,n=10,输出:[“255.0.0.7/32“,“255.0.0.
2021-09-02:IP 到 CIDR。给定起始IP和整数n,返回长度最小的CIDR块。力扣751。比如:ip=255.0.0.7,n=10,输出:[“255.0.0.7/32”,“255.0.0.8/29”,“255.0.0.16/32”]。
福大大 答案2021-09-02:
具体见代码。
代码用golang编写。代码如下:
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
ip := "255.0.0.7"
n := 10
ret := ipToCIDR(ip, n)
fmt.Println(ret)
}
func ipToCIDR(ip string, n int) []string {
// ip -> 32位整数
cur := status(ip)
// cur这个状态,最右侧的1,能表示下2的几次方
maxPower := 0
// 已经解决了多少ip了
solved := 0
// 临时变量
power := 0
ans := make([]string, 0)
for n > 0 {
// cur最右侧的1,能搞定2的几次方个ip
// cur : 000...000 01001000
// 3
maxPower = mostRightPower(cur)
// cur : 0000....0000 00001000 -> 2的3次方的问题
// sol : 0000....0000 00000001 -> 1 2的0次方
// sol : 0000....0000 00000010 -> 2 2的1次方
// sol : 0000....0000 00000100 -> 4 2的2次方
// sol : 0000....0000 00001000 -> 8 2的3次方
solved = 1
power = 0
// 怕溢出
// solved
for (solved<<1) <= n && (power+1) <= maxPower {
solved <<= 1
power++
}
ans = append(ans, content(cur, power))
n -= solved
cur += solved
}
return ans
}
// ip -> int(32位状态)
func status(ip string) int {
ans := 0
move := 24
for _, str := range strings.Split(ip, ".") {
// 17.23.16.5 "17" "23" "16" "5"
// "17" -> 17 << 24
// "23" -> 23 << 16
// "16" -> 16 << 8
// "5" -> 5 << 0
strInt, err := strconv.Atoi(str)
if err != nil {
fmt.Println("错误", err)
return 0
}
ans |= strInt << move
move -= 8
}
return ans
}
var map0 = make(map[int]int)
// 1 000000....000000 -> 2的32次方
func mostRightPower(num int) int {
// map只会生成1次,以后直接用
if len(map0) == 0 {
map0[0] = 32
for i := 0; i < 32; i++ {
// 00...0000 00000001 2的0次方
// 00...0000 00000010 2的1次方
// 00...0000 00000100 2的2次方
// 00...0000 00001000 2的3次方
map0[1<<i] = i
}
}
// num & (-num) -> num & (~num+1) -> 提取出最右侧的1
return map0[num&(-num)]
}
func content(status int, power int) string {
builder := make([]byte, 0)
for move := 24; move >= 0; move -= 8 {
builder = append(builder, []byte(fmt.Sprintf("%d.", status&(255<<move)>>move))...)
}
builder[len(builder)-1] = '/'
builder = append(builder, []byte(fmt.Sprintf("%d", 32-power))...)
return string(builder)
}
执行结果如下:

2021-09-02:IP 到 CIDR。给定起始IP和整数n,返回长度最小的CIDR块。力扣751。比如:ip=255.0.0.7,n=10,输出:[“255.0.0.7/32“,“255.0.0.的更多相关文章
- System.Web.HttpCompileException (0x80004005): (0): error CS0016: 未能写入输出文件
重新系统后,iis asp.net站点老是出现: System.Web.HttpCompileException (0x80004005): (0): error CS0016: 未能写入输出文件“c ...
- 07/29/2013 02:10:02 AM - CMDPHP: Poller[0] Host[6] DS[10] WARNING: Result from SNMP not valid. Partial Result: U
snmpwalk -c public -v2c 客户端ip地址 自定义的oid 能取到数据,但是服务器端就是图片一片空白 rrdtool fetch 文件名.rrd 查看到的全都是nan cac ...
- orcle :Could not initialize "D:\app\Administrator\product\11.2.0\dbhome_1\bin\oci.dll" Make sure you have the 32 bits Oracle Client installed.
服务器重启后,数据库登录信息为空 错误信息: ---------------------------(Not logged on) - PL/SQL Developer---------------- ...
- Linux下Oracle 10.2.0.1升级到10.2.0.4总结
最近部署测试环境时,将测试环境ORACLE数据库从10.2.0.1升级到了10.2.0.4,顺便整理记录一下升级过程. 实验环境: 操作系统:Oracle Linux Server release 5 ...
- USB 3.0规范中译本 第10章 集线器,主机下行口以及设备上行口规范
本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章描述USB 3.0 集线器的体系结构要求.本章还描述主机下行口和集线器下行口之间功能性的不同之处,以及设 ...
- SELECT INTO和INSERT INTO SELECT的区别 类似aaa?a=1&b=2&c=3&d=4,如何将问号以后的数据变为键值对 C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等) C# MD5 加密,解密 C#中DataTable删除多条数据
SELECT INTO和INSERT INTO SELECT的区别 数据库中的数据复制备份 SELECT INTO: 形式: SELECT value1,value2,value3 INTO Ta ...
- IIS发布网站遇到 编译器错误消息: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary 编
编译错误: 说明:在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息:CS0016: 未能写入输出文件“c:\Windows\Microso ...
- rac 10g 10.2.0.1升级到10.2.0.5具体解释
RAC 10.2.0.1 升级到 10.2.0.5 一. 准备: Patch 包:p8202632_10205_LINUX.zip 节点数:3个节点 RAC1 RAC2 ...
- .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序
.NET 跨平台RPC框架DotNettyRPC DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...
- Spark2.0机器学习系列之10: 聚类(高斯混合模型 GMM)
在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法: (1)K-means (2)Latent Dirichlet allocation (LDA) ...
随机推荐
- [极客大挑战 2019]BuyFlag 1
好吧,又是一道违背我思想的题目,哦不哦不不对,是本人操作太傻了 首先进入主页面 没有发现什么奇怪的东西,查看源代码,搜索.php 可以看到有一个pay.php,访问查看 给我们了一些提示 FLAG N ...
- 在Linux中安装containerd作为kubernetes的容器运行时
概述 从kubernetes1.24开始的版本移除了内置的docker支持,用户可以自行选择需要使用的容器运行时,比如containerd.CRI-O.Docker Engine等等,这里我们采用二进 ...
- 使用sync.Once实现高效的单例模式
1. 简介 本文介绍使用sync.Once来实现单例模式,包括单例模式的定义,以及使用sync.Once实现单例模式的示例,同时也比较了其他单例模式的实现.最后以一个开源框架中使用sync.Once实 ...
- Mathematica做数字图像处理中的ImageConvolve练习
目录 ImageConvolve练习 original right sobel 垂直边检测 top sobel 水平边检测 通过一个平方内核的卷积使图像变平滑 类似ConstantArray[1, { ...
- Linux文件上传下载--rz/sz命令
原文地址:https://www.cnblogs.com/igoodful/p/14694038.html 1.rz 命令 1.1 命令简介 rz 命令(Receive ZMODEM),使用 ZMOD ...
- Vue-router与hash与history区别
vue-router 基本使用 路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容.Home ...
- bpmnjs的基本使用(vue)
bpmn-js在vue中的基本使用 效果: 下载依赖包 npm i bpmn-js bpmn-js-properties-panel camunda-bpmn-moddle "bpmn-js ...
- 【原创】Ubuntu Pro 中的RealTime linux(Real-time Ubuntu/PREEMPT-RT/ubuntu官方PREEMPT-RT)
[原创]Ubuntu Pro 订阅中的realtime linux(Real-time Ubuntu/PREEMPT-RT) 目录 [原创]Ubuntu Pro 订阅中的realtime linux( ...
- Hugging News #0331: Hugging Papers 来啦,快来认领你的论文!
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- 有关Spring的ioc理解之代理模式
AOP代理模式可以实现事务控制和业务逻辑代码横切. 使用代理模式,动态代理实现横切. 什么是代理? 接口就是指定要做的事情,要实现的逻辑. 代理类似于房源租房 public interface ZuF ...