根据IP查找城市

567 篇文章

已下架不支持订阅

473 篇文章

已下架不支持订阅

题目解析

本题主要难点在于判断一个IP地址是否属于一个IP段范围。

我的解决思路是,将IP地址转为整型数值,因为IP地址本质上是4*8位二进制数,所以每一个IP地址其实都能对应到一个整型数值。具体转化思路请见下面博客:

整数与IP地址间的转换-优快云博客

而IP地址转为整型数值后,即可通过数值大小关系,判断某个IP地址是否属于某段IP范围。

之后就是,遍历待查询的IP地址,去和每一个IP段范围匹配,如果可以匹配上,且对应IP段范围更小,则对应IP段的城市就是当前待查询IP的最佳匹配城市。

JS算法源码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = as

已下架不支持订阅

### JavaScript 实现 IP 地址定位城市的方法 以下是基于 JavaScript 的实现方法,用于根据 IP 地址查找对应的城市名称。此实现参考了提供的 Python 示例代码逻辑,并进行了语言转换和优化[^1]。 ```javascript function ipToInt(ip) { return ip.split('.').reduce((acc, part, idx) => acc + (parseInt(part) << (8 * (3 - idx))), 0); } function findCity(ipRanges, queries) { const rangeDict = {}; ipRanges.split(';').forEach(ipRange => { const [city, ips] = ipRange.split('='); const [startIp, endIp] = ips.split(','); rangeDict[ipToInt(startIp) + '-' + ipToInt(endIp)] = city; }); const results = queries.split(',').map(query => { const queryInt = ipToInt(query); let matchCity = 'NA'; for (const key in rangeDict) { const [start, end] = key.split('-').map(Number); if (start <= queryInt && queryInt <= end) { matchCity = rangeDict[key]; break; } } return matchCity; }); return results.join(','); } // 输入处理 const ipRanges = "City1=1.1.1.1,1.1.1.2;City1=1.1.1.11,1.1.1.16;City2=3.3.3.3,4.4.4.4;City3=2.2.2.2,6.6.6.6"; const queries = "1.1.1.15,3.3.3.5,2.2.2.3"; console.log(findCity(ipRanges, queries)); // 输出: City1,City2,City3 ``` ### 代码解析 - **`ipToInt` 函数**:将 IPv4 地址转换为整数形式,便于进行数值范围比较。此函数通过位移操作将每个八位字节转换为对应的整数值[^1]。 - **`findCity` 函数**: - 将输入的 `ipRanges` 转换为一个键值对对象 `rangeDict`,其中键为 IP 范围(起始 IP 和结束 IP 的整数值组合),值为对应的城市名称。 - 遍历询的 IP 地址列表,逐一检其是否落在某个 IP 范围内。如果找到匹配的城市,则记录该城市名称;否则返回 `'NA'`[^2]。 - 最终将结果以逗号分隔的形式返回,确保输出格式符合要求。 ### 注意事项 - 如果询的 IP 地址未匹配到任何城市,则返回 `'NA'`,并确保输出的分隔符与输入的 IP 列表长度一致[^2]。 - 假设所有输入均为合法的 IPv4 地址,且不会出现组播或广播地址[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿甘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值