稍微改进边界条件
来源:6-2 复原IP地址-代码演示

Nick_arron
2019-07-30
leetcode 上有两个测试无法通过,第一个是’010010’,分割中出现了010的情况,ip中可以存在个位数的0,但不能存在01,010这种情况;第二种是内存溢出,"111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
,这个测试用例也无法通过。
- 针对1,获取temp时主动将字符串转为数字;如果是01或者010的情况,前面的0会被去掉,此时拼接后的字符串一定不等于原有字符串,也就排除了哪些错误答案。
- 针对2,在search中判断cur长度为4,但拼接后不等于s时,可以终止递归;
function restoreIpAddresses (s) {
let result = []
let search = (cur, sub) => {
if (cur.length === 4 && cur.join('') !== s) return
if (cur.length === 4 && cur.join('') === s) {
result.push(cur.join('.'))
} else {
for (let i = 0, len = Math.min(3, sub.length), temp; i < len; i++) {
temp = +sub.substr(0, i + 1) // 截取第1-3个字符
if (temp < 256) {
search(cur.concat([temp]), sub.substr(i + 1))
}
}
}
}
search([], s)
return result
}
2回答
-
慕斯616794
2019-09-15
同学,考虑得周到!但是temp转为Number类型之后使用startsWith还要转回去 是吧?
012019-09-20 -
快乐动起来呀
2019-07-30
嗯,思路不错,棒棒哒
00
相似问题