题目描述
思路
使用回溯和递归的思想:
1. 首先创建addresses来接收复原后的所有ip地址,然后通过创建回溯方法进行筛选。最终返回addresses
2. 回溯方法的四个参数:1.给定的数字字符串s;2.回溯过程中遍历到的位置;3. 当前确定好的ip段的数量;4. 收集结果的addresses
3. 考虑方法体出口:如果确定好4段并且遍历完整个s,就将cur之间的段以 . 分隔开来放入addresses
4. 接下来对s进行筛选,其中注意每段的长度最大为3,拆箱成int后的大小不超过255,起始位置不能为0
5. 控制好这些边界条件后就可以正常的利用递归和回溯遍历字符串
代码
一些代码问题
- String.join()方法:连接指定数组的元素或集合的成员,在每个元素或成员之间使用指定的分割符。
- String.StartsWith()方法:用于检测字符串是否以指定的前缀开始
语法
public boolean startsWith(String prefix, int toffset)
或
public boolean startsWith(String prefix)
参数
prefix – 前缀。
toffset – 字符串中开始查找的位置。 - java中Integer.parseInt和Integer.valueOf 的区别:
- static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行分析。
- static Integer valueOf(int i) 返回一个表示指定的 int 值的 Integer 实例。
- static Integer valueOf(String s) 返回保持指定的 String 的值的 Integer 对象。
- 从返回值可以看出他们的区别
- parseInt()返回的是基本类型int 而valueOf()返回的是包装类Integer
- Integer是可以使用对象方法的 而int类型就不能和Object类型进行互相转换 。
- Java 集合类中的 List.remove() 方法用于移出列表中的指定元素。返回值为被移除的元素。
关于回溯算法
回溯算法实际上就是在一个树形问题上做深度优先遍历,因此首先需要把问题转换为树形问题。
在画树形图的过程中,有一些枝叶是没有必要的,把没有必要的枝叶减去的操作就是剪枝,在代码中一般通过 break 或者 continue 和 return(表示递归终止)实现。
代码优化
StringBuilder用来存放构造的ip地址,避免大量字符串的拼接所以使用此类