当前位置: 首页 > ops >正文

每日一题:1、虚拟IPv4地址转换为32位整数(JS)

题目背景

我们需要处理一种特殊的虚拟IPv4地址,这种地址由4个小节组成,每节之间用#分隔。与标准IPv4地址不同,虚拟IPv4地址的第一节范围是1~128,后三节的范围是0~255。我们需要将这种虚拟IPv4地址转换为一个唯一的32位整数。如果输入的地址不合法,则返回invalid IP

输入输出
  • ​输入​​:一行字符串,表示虚拟IPv4地址,例如128#0#255#2551#0#0#0
  • ​输出​​:
    • 如果地址合法,输出对应的32位整数(十进制形式),例如214754918316777216
    • 如果地址非法,输出invalid IP
地址合法性规则
  1. ​格式​​:必须由4个小节组成,以#分隔,例如A#B#C#D
  2. ​范围​​:
    • 第一节(A):1~128(闭区间)。
    • 第二节(B)、第三节(C)、第四节(D):0~255(闭区间)。
  3. ​其他非法情况​​:
    • 小节数量不是4个。
    • 某一个小节不是数字。
    • 数字超出范围。
    • 数字前导有无效字符(例如012是合法的,但+1212a是非法的)。
转换规则

将虚拟IPv4地址的4个小节分别看作一个8位二进制数,按顺序拼接成一个32位二进制数,然后转换为十进制整数。具体步骤如下:

  1. 将每一节转换为8位二进制:
    • 第一节(A):A的二进制,高位补0到8位。
    • 第二节(B):B的二进制,高位补0到8位。
    • 第三节(C):C的二进制,高位补0到8位。
    • 第四节(D):D的二进制,高位补0到8位。
  2. 拼接4个8位二进制,得到一个32位二进制数。
  3. 将32位二进制数转换为十进制整数。
示例
  1. 输入:128#0#255#255

    • 解析:
      • 第一节:128 → 10000000
      • 第二节:0 → 00000000
      • 第三节:255 → 11111111
      • 第四节:255 → 11111111
    • 拼接:10000000 00000000 11111111 11111111 → 0x8000FFFF
    • 十进制:2147549183
    • 输出:2147549183
  2. 输入:1#0#0#0

    • 解析:
      • 第一节:1 → 00000001
      • 第二节:0 → 00000000
      • 第三节:0 → 00000000
      • 第四节:0 → 00000000
    • 拼接:00000001 00000000 00000000 00000000 → 0x01000000
    • 十进制:16777216
    • 输出:16777216
  3. 输入:129#0#0#0

    • 解析:第一节是129,超出1~128范围。
    • 输出:invalid IP
  4. 输入:128#0#255

    • 解析:只有3个小节,不合法。
    • 输出:invalid IP
解题思路
  1. ​输入校验​​:
    • 检查是否由4个小节组成(用#分隔)。
    • 检查每一小节是否为纯数字(无前导符号或字母)。
    • 检查数字范围:
      • 第一节:1~128
      • 后三节:0~255
  2. ​转换​​:
    • 将每一节转换为整数。
    • 将每一节转换为8位二进制字符串。
    • 拼接4个8位二进制字符串。
    • 将32位二进制字符串转换为十进制整数。
  3. ​输出​​:
    • 合法:输出整数。
    • 非法:输出invalid IP

const readline = require('readline');// 判断字符串是否为数字
function isNumeric(str) {for (let i = 0; i < str.length; i++) {if (!/\d/.test(str[i])) {return false; // 如果有非数字字符则返回false}}return true; // 全部为数字则返回true
}const rl = readline.createInterface({input: process.stdin,output: process.stdout
});rl.on('line', function (input) {const ipSections = input.split('#'); // 将输入的字符串按照"#"分割成4个小节if (ipSections.length !== 4) { // 如果分割后的小节数量不等于4,则说明输入的IPv4地址格式不正确console.log("invalid IP");rl.close();return;}// 遍历每个部分进行检查for (const section of ipSections) {if (section.length === 0 || !isNumeric(section)) { // 检查是否为空或者是否每部分都是数字console.log("invalid IP");rl.close();return;}// 检查前导零的情况if (section.length > 1 && section[0] === '0') {console.log("invalid IP");rl.close();return;}}const firstSection = parseInt(ipSections[0], 10); // 将第一个小节转换为整数if (firstSection < 1 || firstSection > 128) { // 如果第一个小节的值不在1~128的范围内console.log("invalid IP");rl.close();return;}// 检查其余3个小节的范围for (let i = 1; i < 4; i++) {const sectionValue = parseInt(ipSections[i], 10); // 将当前小节转换为整数if (sectionValue < 0 || sectionValue > 255) { // 如果不在0~255范围内console.log("invalid IP");rl.close();return;}}// 计算最终的32位整数let ipValue = 0;//左移8位​​和​并累加​,在二进制中,乘以256(即 2^8)相当于将数字向左移动8位,空出最低的8位用于存放下一个字节​for (let i = 0; i < 4; i++) {ipValue = ipValue * 256 + parseInt(ipSections[i], 10); // 每个小节对应一个字节,计算最终的整数值}console.log(ipValue); // 输出最终的32位整数rl.close();
});

http://www.xdnf.cn/news/7598.html

相关文章:

  • 你知道mysql的索引下推么?
  • 【办公类-18-04】(Python)“验血单信息”批量生成打印(学校、班级、姓名、性别)
  • 三色光源投影暗战:FSHD 如何撕开 DLP/3LCD 垄断缺口?
  • Ubuntu软件仓库与更新源配置指南
  • 系统架构设计(十六):敏感点、权衡点、风险点和非风险点
  • 手动导出Docker进行并自动执行脚本命令的操作方法
  • vue3中使用Element-Plus的几种方式
  • 汉得集星獭1.8.0正式发布,高效集成再赋能!
  • 《算法笔记》11.4小节——动态规划专题->最长公共子序列(LCS) 问题 A: 最长公共子序列
  • 动态规划-LCR 090.打家劫舍II-力扣(LeetCode)
  • 文档债务拖累交付速度?5大优化策略文档自动化
  • 电子电器架构 --- 汽车高性能计算
  • 【踩坑】WUDFHost占用内存高的可能原因
  • 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎,支持现实世界的流程自动化需求
  • 深入解析 OpenManus:开源 AI 智能体框架的技术原理与实践
  • 分钟级降水预报API:精准预测每一滴雨的智慧科技
  • 【物联网】基于树莓派的物联网开发【5】——国内软件镜像源更改配置
  • 使用布隆过滤器实现java大数据筛选是否存在
  • 如何解决虚拟机中U盘无法识别的问题
  • 抖音视频如何下载保存?高清无水印一键保存到手机!
  • 基于Gitee 的开发分支版本管理规范
  • 视频监控联网系统GB28181协议中互联结构详解
  • AI大模型应用微调服务商分享:微调技术Lora和SFT的异同
  • 8 定时任务与周期性调度
  • 小红书“开门”,摸到电商金钥匙?
  • Linux(3)——基础开发工具
  • langchain 实现 任务分解器
  • 深度学习中的正则化方法与卷积神经网络基础
  • leetcode hot100:三、解题思路大全:哈希(两数之和、字母异位词分组、最长连续序列)、双指针(移动零、盛最多水的容器、三数之和、接雨水)
  • beanstalk一直被重新保留(reserved 状态)消息删除