亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

合并帶連字符字符串范圍的間隔

合并帶連字符字符串范圍的間隔

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 關注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號