求0~9各出现一次并且地址用二进制表示时左右对称的IP地址

该博客探讨了如何找到满足0~9每个数字出现一次,且其二进制表示具有对称性的IPv4地址。通过分析IP地址的10进制和二进制表示,博主提出了从小于256的数值中寻找对称数对,再组合以确保所有数字唯一的方法,并提供了Java实现。
摘要由CSDN通过智能技术生成

一、说明

举个例子193.245.60.78,就是符合0~9各出现一次的IP地址,其二进制表示为 11000001 11110101 00111100 01001110。可见,二进制表示的值并不是对称的。

二、思路

1、首先,需要考虑IP的形式,发现其由4个8位二进制数组成,为了符合阅读习惯,一般显示的均为10进制的IP地址。

2、对于10进制来讲,ipv4形式的IP地址,其4个8位二进制数最大均为255,所以单个8位表示的10进制数是好确定的,遍历0~255即可。

3、又因为二进制表示时,其值是对称的,所以可以判定对于形如 68.205.179.34 这样的IP地址,按照题意,68表示的二进制数(01000100)和34表示的二进制数(00100010)对称、205表示的二进制数(11001101)和179表示的二进制数(10110011)对称。

4、所以,可以先求符合对称条件,并且各位均不相同的数对,这个范围很小,仅在小于256范围内找即可,找到之后进行组合,符合0~9只出现一次即可。

三、Java实现

/**
 * 返回符合条件的数对
 * @return
 */
public static Map<Integer, Integer> findSuitblePair() {
   
  // a.b.c.d
  // 每个数都在0-255之间
  int a = 0;
  int d = 0;

  // 用于存储计算过的符合对称条件、并且各位均不重复的    值--对应的二进制倒序值 的map
  Map<Integer, Integer> valRevMap = new HashMap<>();

  // 求d即可,根据对称条件可算出a
  // 把符合条件的数值对都算出来之后,组合成4个十进制数组成的IP,筛选出0~9各出现一次的即可
  while (d < 256) {
   
    // 对个、十、百位上的值进行标记,后边填充时如果该索引上的值不为-1了
    // 说明填充过,也就是说这个值出现了重复,放弃
    int[] val = new int[]{
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
    int remaind0 = d % 10;// 取个位值
    int remaind1 = d % 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值