一天一大 lee(复原IP地址)难度:中等-Day20200809
时间:2022-07-25
本文章向大家介绍一天一大 lee(复原IP地址)难度:中等-Day20200809,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 '.' 分隔。
示例
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
抛砖引玉
抛砖引玉
思路
暴力枚举
- 从s开始位置枚举A、B、C、D四个数字,要求:
- 四个数字拼接起来等于s 注意如果其中有数字0开头会丢失字符
- 任意数字不超过255
- A:0-a
- B:a-a+b
- C:a+b-a + b + c
- d:a + b + c-len
/**
* @param {string} s
* @return {string[]}
*/
var restoreIpAddresses = function(s) {
let len = s.length,
result = [],
IP = '';
for (let a = 1; a < 4; ++a) {
for (let b = 1; b < 4; ++b) {
for (let c = 1; c < 4; ++c) {
if (a + b + c < len) {
let A = +s.substring(0, a),
B = +s.substring(a, a + b),
C = +s.substring(a + b, a + b + c),
D = +s.substring(a + b + c);
if (A <= 255 && B <= 255 && C <= 255 && D <= 255) {
IP = A + '.' + B + '.' + C + '.' + D;
if (IP.length === len + 3) result.push(IP);
}
}
}
}
}
return result;
}
递归
- 参数:已匹配的数量,待匹配的开始位置
- 和暴力解法相似,待匹配的开始位置默认0
- 之后的待匹配开始位置start根据匹配情况递增
- 匹配4段则存到结果数字
- 遇到开始匹配位置为0,0,独立存在则直接开始下一次匹配
/**
* @param {string} s
* @return {string[]}
*/
var restoreIpAddresses = function(s) {
let dp = Array(4),
result = [];
const dfs = (s, ip, start) => {
// 匹配4段
if (ip === 4 && start === s.length) {
// 字符匹配完成
if (start === s.length) {
result.push(dp.join('.'));
}
return;
}
// 匹配完字符未匹配4段,匹配失败结束
if (start === s.length) return;
// 遇到开始匹配位置为0,0,独立存在则直接开始下一次匹配
if (s.charAt(start) === '0') {
dp[ip] = 0;
dfs(s, ip + 1, start + 1);
}
// 枚举每一种可能性并递归
let num = 0;
for (let i = start; i < s.length; ++i) {
num = num * 10 + (s.charAt(i) - '0');
if (num > 0 && num <= 255) {
dp[ip] = num;
dfs(s, ip + 1, i + 1);
} else {
break;
}
}
}
dfs(s, 0, 0);
return result;
};
- 《像计算机科学家一样思考Java》—— 读后总结
- 记录安装oracle的那些事(三)之oracle Database R2安装
- Elasticsearch Javascript API增删改查
- Oracle二三事之 Oracle SPARC SuperCluster的九大技术优势
- 两个 viewports 的故事-第二部分
- 通过 JS 实现简单的拖拽功能并且可以在特定元素上禁止拖拽
- AngularJS 技术总结
- 《linux c编程指南》学习手记5
- AngularJS API之bootstrap启动
- 通过 JS 判断页面是否有滚动条的简单方法
- Log4j官方文档翻译(六、日志的级别)
- AngularJS API之isXXX()
- 《linux c编程指南》学习手记4
- Kibana中doc与search策略的区别
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Ubuntu18.04下将 磁盘挂载在某目录下
- Android编程之绘图canvas基本用法示例
- Android 编译出错版本匹配问题解决办法
- Linux(CentOS7)使用 RPM 安装 mysql 8.0.11的教程
- Android Adapter里面嵌套ListView实例详解
- Centos7 安装达梦数据库的教程
- Android开发使用Handler实现图片轮播功能示例
- 简单实现Android刮刮卡效果
- CentOS7.4下 安装JDK1.8的图文教程
- Android Studio中导入JNI生成的.so库的实现方法
- Android实现文件上传和下载倒计时功能的圆形进度条
- 使用Apache ab进行http性能测试
- Android Imageloader的配置的实现代码
- Linux下如何查看版本信息的方法步骤
- Android开发实现Files文件读取解析功能示例