day 24 | ● 93.复原IP地址 ● 78.子集 ● 90.子集II

文章介绍了如何修复一个用于复原IP地址的函数,使用字符串处理和递归方法,并提供了两个生成子集的函数,一个考虑重复,另一个排除重复。

93.复原IP地址

判断ip是否在0-255放在外面新建了一个逻辑函数就错了,有点没搞懂,时间来不及了,就没细看。
又学到了一个新函数

num, _ := strconv.Atoi(str)//可以将string直接转为int

str := strings.Join(path, ".") //将[]int类型的path转换为string类型,并且在中间加上"."分开.
func restoreIpAddresses(s string) []string {
    ret := make([]string, 0)
    path := make([]string, 0)
    var build func(int)
    build = func(index int){
        if len(path) > 8 {return}
        if len(path) == 8 && index == len(s){
            tmp := ""
            for i := 0; i < len(path) - 1; i++{
                tmp += path[i]
            }
            ret = append(ret, tmp)
            return
        }

        for i := index;i < len(s); i++{
            if i != index && s[index] == '0'{
                break
            }
            str := s[index: i + 1]
            num, _ := strconv.Atoi(str)

            if num >= 0 && num <= 255{
                path = append(path, str)
                path = append(path, ".")
                build(i+1)
                path = path[:(len(path) - 2)]
            }
        }
    }
    build(0)
    return ret
}

78.子集

子集就是每一个都要存进去
在这里插入图片描述

func subsets(nums []int) [][]int {
    ret := make([][]int, 0)
    path := make([]int, 0)
    var build func(int)
    build = func(index int){
        ret = append(ret, append([]int(nil), path...))
        if index == len(nums) { return }

        for i := index; i < len(nums); i++{
            path = append(path, nums[i])
            build(i + 1)
            path = path[: (len(path) - 1)]
        }
    }
    build(0)
    return ret
}

90.子集II

这里就有重复的了,因为要求不能重复,所以就还是代码随想录中树层不能重复的那一种思路。

if i != index && nums[i] == nums[i - 1]{
     continue
}
func subsetsWithDup(nums []int) [][]int {
    sort.Ints(nums)
    ret := make([][]int, 0)
    path := make([]int, 0)
    var build func(int)
    build = func( index int){
        ret = append(ret,append([]int(nil), path...))
        if index == len(nums) {
            return 
        }

        for i := index; i < len(nums); i++{
            if i != index && nums[i] == nums[i - 1]{
                continue
            }
            path = append(path, nums[i])
            build(i + 1)
            path = path[:(len(path) - 1)]
        }
    }
    build(0)
    return ret
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值