一、说明
举个例子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 %