为了账号安全,请及时绑定邮箱和手机立即绑定

合并带连字符字符串范围的间隔

合并带连字符字符串范围的间隔

Go
撒科打诨 2022-09-19 14:50:00
我有一个这样的字符串:ports := []string{"1", "2-7", "12-1200", "10-500"}我想从中设置一个整数,就像输出应该是:[]intSet{ 1, 2-7, 10-1200 }哪里是某种整数集,我可以轻松地从中移除和添加元素。intSet更新 1intSet是 的列表。所以,也是一套。sets2-7更新 2在这里,最大的集合被合并。例如“1” -> 1“2-7” -> 2-7“12-1200” & “10-500” => “10..12.....500....1200” -> 10-1200由于它是一个所以它包含了一个独特的范围,这个范围涵盖了整个集合。set
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

package main


import (

    "fmt"

    "log"

    "strconv"

    "strings"

)


type intSet struct {

    start int

    end   int

}


func (s intSet) String() string {

    if s.start == s.end {

        return fmt.Sprintf("%d", s.start)

    }

    return fmt.Sprintf("%d-%d", s.start, s.end)

}


func (s intSet) in(i int) bool {

    return s.start <= i && i <= s.end

}


func (s *intSet) union(set intSet) {

    if set.start < s.start {

        s.start = set.start

    }


    if set.end > s.end {

        s.end = set.end

    }

}


func insert(set intSet, is []intSet) bool {

    for i, s := range is {

        if s.in(set.start) || s.in(set.end) {

            is[i].union(set)

            return true

        }

        //updated here with thankful to @mh-cbon

        if set.in(s.start) || set.in(s.end) {

            is[i].union(set)

            return true

        }

    }

    return false

}


func main() {

    var set []intSet

    ports := []string{"1", "2-7", "12-1200", "10-500", "9-5500"}

    for _, port := range ports {

        s := strings.Split(port, `-`)

        if len(s) < 1 || len(s) > 2 {

            log.Fatalln(`set cannot have multiple values or no value`)

        }

        start, err := strconv.Atoi(s[0])

        if err != nil {

            log.Fatalln(err)

        }

        end := start

        if len(s) == 2 {

            end, err = strconv.Atoi(s[1])

            if err != nil {

                log.Fatalln(err)

            }

        }


        temSet := intSet{

            start: start,

            end:   end,

        }

        if !insert(temSet, set) {

            set = append(set, temSet)

        }

    }


    fmt.Println(set) //[1 2-7 9-5500]

}

在这里运行


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号