Leetcode - 93. 复原IP地址

解题思路参考代码中的注释:
class Solution {
    public List<String> restoreIpAddresses(String s) {
        List<String> ret = new ArrayList<>();
        
        // 将字符串转成整数数组,方便操作
        int[] nums = new int[s.length()];
        for (int i = 0; i < s.length(); i++) {
            nums[i] = s.charAt(i) - '0';
        }
        
        // 从nums[0]处开始解析ip地址
        dfs(nums, 0, new int[4], 0, ret);
        
        return ret;
    }

    // 从nums[begin]处开始解析ip地址
    private static void dfs(int[] nums, int begin, int[] ip, int idx, List<String> ret) {

        // 如果剩余的未解析的部分过长或过短,则解析失败
        // 比如ip地址已经解析了前2段,但nums的剩余部分长度大于6或小于2,此时解析失败
        if (nums.length - begin > (4 - idx) * 3 || nums.length - begin < 4 - idx) {
            return;
        }

        // 如果已经解析出了4部分的ip地址,则将结果保存起来
        if (idx == 4) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 3; i++){
                sb.append(ip[i]);
                sb.append('.');
            }
            sb.append(ip[3]);
            ret.add(sb.toString());
            return;
        }

        // ================================= 否则开始尝试解析 =================================

        // 临时变量
        int sum = nums[begin];
        
        // 首先,当前数肯定可以作为ip地址单独的一段,因此先尝试单独解析
        ip[idx] = sum;
        dfs(nums, begin + 1, ip, idx + 1, ret);

        // 然后再尝试用当前数和下一个数作为ip地址的一段来解析,前提是当前数不为0
        if (begin + 1 == nums.length || (sum = sum * 10 + nums[begin + 1]) < 10) {
            return;
        }
        ip[idx] = sum;
        dfs(nums, begin + 2, ip, idx + 1, ret);

        // 然后再尝试用当前数和后面两个数作为ip地址的一段来解析,前提是三者组成的数小于256
        if (begin + 2 == nums.length || (sum = sum * 10 + nums[begin + 2]) >= 256) {
            return;
        }
        ip[idx] = sum;
        dfs(nums, begin + 3, ip, idx + 1, ret);
    }
}
全部评论

相关推荐

Kurumis:整个简历看下来就发现你其实对测试理解还很浅,很多地方都是硬凑上去,项目也是学生课设级别,没什么含金量 首先是学习建议: 1.系统性了解一个真实工程的框架,有利于你后续提升项目含金量,理解测试的逻辑 2.真正去学一下自动化测试和性能测试 再就是简历本身包装问题: 1.投测试的话就不要说自己独立开发自己测,专注描述自己怎么做测试的 2.项目经历太像套话,很容易让人怀疑你到底真的做过没有,比如并发是具体做了多少并发?自动化脚本是怎么跑兼容性和性能测试的?测试用例写了多少条? 3.教务管理系统一听就是数据库课设作业,含金量不高,不过你可以在原项目基础上重构扩展,比如添加docker容器部署MySQL和Redis,添加消息队列和锁机制防止系统扛不住高并发访问,让它真的像个实际工程 4.技能里性能专项测试没有把握不要乱写,就写你会什么工具就行了,做专项性能测试的都是行业大佬,你要写的话一定要有对应的专项性能测试项目 5.可以在简历里附上项目链接,压缩简历内容的同时提升简历真实性
今天你投了哪些公司?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务