看到的文章链接如下https://mp.weixin.qq.com/s/8G...
题目如下
/** 2. 寻找特定 IPIPV4 的 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};