关于面试:阿里的一道Ipv4转32进制回文笔试题

5次阅读

共计 1151 个字符,预计需要花费 3 分钟才能阅读完成。

看到的文章链接如下 https://mp.weixin.qq.com/s/8G…
题目如下

/** 2. 寻找特定 IP
IPV4 的 IP 地址是 32 位的二进制数,为加强可读性,通常咱们以 8 位为 1 组进行宰割,用十进制来示意每一部分,并用点号连贯,譬如 192.168.1.1。显然,存在这样的 IP 地址,0 到 9 十个数字各呈现一次。具备这样特色的 IP 地址里,示意成二进制数时,二进制数左右对称(也就是“回文”,示意成 32 位二进制不省略 0)的状况有几种,别离是哪些?要求性能尽可能高
*/

记录下 可能有脱漏 最初后果是 80 种 有点相似算法题两数之和 可能还有更好的解法 临时还没想到

var findSpecialIp = function(nums, target) {let res = []
    let m = new Map()
    let group = []
    var isPalindrome = function(x) { // 查看回文
        return x.toString() == x.toString().split("").reverse().join("");
    };
    let hasRepeatNum = function(...args) {let a = args.toString()
        let b = [...new Set(a.split(""))]
        return a.length !== b.length
    }
    let getIp = function([a,b], [c,d]) {//[16,8] [32,4]
        return [`${a}.${c}.${d}.${b}`,
            `${b}.${c}.${d}.${a}`,
            `${a}.${d}.${c}.${b}`,
            `${b}.${d}.${c}.${a}`
            ]
    }
    for(let i = 0; i< 256; i++) {if(!hasRepeatNum(i) || i < 11) {let self = (i).toString(2).padStart(8, 0) // 转为 2 进制后补 0 
            let re = self.split("").reverse().join("") // 翻转
            if(!isPalindrome(self)) { // 如果不是回文
                if(m.has(self)) { // i 和 num 对称 组成回文
                    let num = m.get(self)
                    if(!hasRepeatNum(i, num)) {group.push([i, num])
                    }
                } else {m.set(re, i)
                }
            }
        }
    }
    for(let i = 0 ; i < group.length; i++) {for(let j = i+1; j < group.length; j++) {if(!hasRepeatNum(group[i].join(""),group[j].join(""))) {res = res.concat(getIp(group[i], group[j]))
            }
        }
    }
    return res
};
正文完
 0