国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 后端開發(fā) Golang Golang 代碼的出現(xiàn):排序頁面

Golang 代碼的出現(xiàn):排序頁面

Dec 28, 2024 am 07:33 AM

介紹

這是代碼出現(xiàn)的第五天,今天我們遇到了一個有趣的頁面排序問題。讓我們深入探討這個問題以及我是如何解決它的。如果平靜地思考,這是一個非常簡單的問題,否則,它會陷入地圖、列表和索引的混亂中。

您可以在 GitHub 上查看我的解決方案。

Advent of Code ay n Golang: Ordering Pages 破壞先生 / 代碼出現(xiàn)

代碼的出現(xiàn)

輸入

在第 5 天的輸入中,我們有兩個部分,第一個部分定義了頁面排序規(guī)則,具體來說哪個頁面應(yīng)該在哪個頁面之前,第二個部分包含頁面的實際順序。

47|53
97|13
97|61
97|47
75|29
61|13
75|53
29|13
97|29
53|29
61|53
97|53
61|29
47|13
75|47
97|75
47|61
75|61
47|29
75|13
53|13

75,47,61,53,29
97,61,53,29,13
75,29,13
75,97,47,61,53
61,13,29
97,13,75,29,47

因此,第一部分制定了規(guī)則,另一部分制定了頁面的順序,每一行都是一個查詢或頁面列表,作為我們要處理的實際數(shù)據(jù)。我們需要在第 1 部分和第 2 部分的處理中使用它。

閱讀部分

因此,我們需要解析這些部分并以更易于訪問的數(shù)據(jù)結(jié)構(gòu)讀取它們。

一種方法是

  • 包含兩個部分的列表

  • 第一部分將是一個列表

    • 該列表將是一個整數(shù)列表,用于保存兩個整數(shù),即用于規(guī)則
  • 第二部分將是一個列表

    • 列表將是一個整數(shù)列表,用于保存頁面列表

因此,數(shù)據(jù)結(jié)構(gòu)看起來像一個整數(shù)列表的列表。

func ReadFileSections(path string) [][][]int {

    fileBytes := ReadFileBytes(path)
    lines := []string{}
    separator := []byte("\n\n")
    for _, line := range bytes.Split(fileBytes, separator) {
        if string(line) != "" {
            lines = append(lines, string(line))
        }
    }

    sections := [][][]int{}
    for i, section := range lines {
        nums := [][]int{}
        lineStrs := strings.Split(section, "\n")
        separator := ","
        if i == 0 {
            separator = "|"
        }
        for _, lineStr := range lineStrs {
            if lineStr == "" {
                continue
            }
            numL := []int{}
            for _, numStr := range strings.Split(lineStr, separator) {
                num, _ := strconv.Atoi(numStr)
                numL = append(numL, num)
            }
            nums = append(nums, numL)
        }
        sections = append(sections, nums)
    }
    return sections
}

上述名為 ReadFileSections 的函數(shù)接受輸入文件的路徑并返回所討論的整數(shù)列表的切片/數(shù)組。我們首先讀取文件并將字節(jié)拆分為兩個換行符,這將作為各部分的分隔符,我們將這些行存儲為字符串列表,第一個將包含規(guī)則行,第二個將包含頁面列表行。

然后我們迭代該部分并使用相應(yīng)的分隔符分別分割各部分的各個行,即 |對于第一部分,(空白)對于第二部分。我們正在解析每一行以獲取整數(shù)列表并將它們附加到相應(yīng)的部分。

所以,我們現(xiàn)在有了可以用來構(gòu)建規(guī)則和頁面來幫助處理問題的數(shù)據(jù)。

構(gòu)建規(guī)則

現(xiàn)在,我們需要處理規(guī)則列表以方便訪問,我們需要獲取給定頁面之后應(yīng)該出現(xiàn)的頁碼,因此我們將使用帶有整數(shù)列表的整數(shù)映射,其中鍵為第一個數(shù)字和值中的一個將是第二個數(shù)字(按頁面順序應(yīng)出現(xiàn)在其后的數(shù)字)。

func ConstructRules(rulesList [][]int) map[int][]int {
    rules := make(map[int][]int)
    for _, rule := range rulesList {
        rules[rule[0]] = append(rules[rule[0]], rule[1])
    }
    return rules
}

我們簡單地迭代整數(shù)列表,并將第一個元素映射為鍵,將值映射為列表中的第二個元素,以便可視化:

FROM

[][]int

[
    [47,53]
    [97,13]
    [97,61]
]

TO

map[int][]int
{
    47: [53]
    97: [13,61]
}

所以,現(xiàn)在規(guī)則是整數(shù)與整數(shù)的映射。

構(gòu)建指數(shù)

現(xiàn)在,為了使第一部分和第二部分更容易,我們需要使用頁面列表中出現(xiàn)的索引為規(guī)則部分中的每個數(shù)字制作一個映射。

因此,我們將迭代規(guī)則,這是一個整數(shù)和整數(shù)的映射,我們將創(chuàng)建一個整數(shù)映射,它將幫助我們根據(jù)規(guī)則創(chuàng)建唯一的整數(shù)列表。

現(xiàn)在,一旦我們從規(guī)則中獲得了整數(shù)列表,我們將迭代所有數(shù)字,并在每個頁面行上檢查它出現(xiàn)的索引,以創(chuàng)建整數(shù)(索引)列表。

因此,我們迭代頁面行中的所有數(shù)字,如果我們在頁面列表中找到該數(shù)字,則附加索引,但是,如果沒有,我們附加 -1,因此對于每一行,我們需要為該數(shù)字附加一個索引,如下所示:

47|53
97|13
97|61
97|47
75|29
61|13
75|53
29|13
97|29
53|29
61|53
97|53
61|29
47|13
75|47
97|75
47|61
75|61
47|29
75|13
53|13

75,47,61,53,29
97,61,53,29,13
75,29,13
75,97,47,61,53
61,13,29
97,13,75,29,47

所以,在上面的例子中,我們以75為參考,我們將得到每個頁碼列表的索引,并得到75出現(xiàn)的索引列表。

現(xiàn)在,這可以通過以下函數(shù)來完成:

func ReadFileSections(path string) [][][]int {

    fileBytes := ReadFileBytes(path)
    lines := []string{}
    separator := []byte("\n\n")
    for _, line := range bytes.Split(fileBytes, separator) {
        if string(line) != "" {
            lines = append(lines, string(line))
        }
    }

    sections := [][][]int{}
    for i, section := range lines {
        nums := [][]int{}
        lineStrs := strings.Split(section, "\n")
        separator := ","
        if i == 0 {
            separator = "|"
        }
        for _, lineStr := range lineStrs {
            if lineStr == "" {
                continue
            }
            numL := []int{}
            for _, numStr := range strings.Split(lineStr, separator) {
                num, _ := strconv.Atoi(numStr)
                numL = append(numL, num)
            }
            nums = append(nums, numL)
        }
        sections = append(sections, nums)
    }
    return sections
}

因此,我們現(xiàn)在已經(jīng)根據(jù)規(guī)則將索引映射到每個頁碼列表。

第 1 部分

現(xiàn)在,對于第一部分,我們需要迭代每個頁面更新(行),然后我們需要檢查頁碼是否遵循規(guī)則,每個數(shù)字都應(yīng)該遵循規(guī)則。這意味著,如果一個數(shù)字在某個數(shù)字之后,但規(guī)則規(guī)定它應(yīng)該在之前,那么它就違反了該更新中的頁碼規(guī)則,因此我們不能將其視為正確的有序頁面,我們需要添加中間頁面每個更新的編號已正確排序為第一部分的答案。

為此,我們迭代每個頁面更新,然后我們需要迭代該頁面更新中的每個數(shù)字,我們獲得與該數(shù)字關(guān)聯(lián)的所有規(guī)則(讓我們稱之為當(dāng)前數(shù)字),因為我們有一個帶有整數(shù)列表的整數(shù)映射。現(xiàn)在,我們必須檢查當(dāng)前所在的數(shù)字是否在其規(guī)則中的數(shù)字之前。因此,我們使用我們創(chuàng)建的數(shù)字索引來檢查當(dāng)前數(shù)字的索引,該索引是一個以整數(shù)列表作為索引的數(shù)字映射。因此,我們獲取地圖的索引列表,其中當(dāng)前編號作為地圖的鍵,列表中的索引作為我們當(dāng)前所在的行/頁面更新的數(shù)量。

然后,一旦我們獲得了當(dāng)前數(shù)字的索引,我們就獲得了第二個數(shù)字的相同索引,即其規(guī)則中的所有數(shù)字,并且如果其規(guī)則中的該數(shù)字存在于該頁行/更新中,即它是不是-1,如果是這種情況,我們類似地獲取它的索引,并檢查它是否出現(xiàn)在符合規(guī)則的當(dāng)前數(shù)字之后,因此,如果任何數(shù)字違反規(guī)則,我們需要將頁面更新標(biāo)記為不正確訂購。

當(dāng)我們發(fā)現(xiàn)該頁面更新的索引規(guī)則被違反時,我們將訂單標(biāo)記為 false。如果我們看到有序標(biāo)志仍然為 true,我們會使用該頁面更新的中間元素來更新分?jǐn)?shù)。

func ConstructRules(rulesList [][]int) map[int][]int {
    rules := make(map[int][]int)
    for _, rule := range rulesList {
        rules[rule[0]] = append(rules[rule[0]], rule[1])
    }
    return rules
}

因此,重申一下,我們創(chuàng)建一個名為 GetOrderedPage 的函數(shù),其中包含規(guī)則和數(shù)字索引作為帶有整數(shù)列表的整數(shù)映射,以及頁面更新時的整數(shù)列表。我們返回分?jǐn)?shù)作為該函數(shù)的輸出。

我們迭代每個頁面更新,然后通過更新中的每個頁碼,檢查該數(shù)字的規(guī)則,如果該數(shù)字的索引低于當(dāng)前數(shù)字,我們將其標(biāo)記為未排序,因此在每個頁面更新的末尾,如果順序正確,我們會使用頁面更新的中間元素更新分?jǐn)?shù)。

所以,這就是第一部分的總結(jié),我們只需要獲得正確排序的頁面更新的分?jǐn)?shù)即可。

第2部分

但是在第 2 部分中,我們需要檢查頁面更新是否按順序進(jìn)行,如果不按順序進(jìn)行更新。

我們對第二部分做了類似的事情,我們需要迭代每個頁面更新,并且對于該頁面更新中的每個數(shù)字,我們需要檢查是否違反規(guī)則,如果遇到以下情況對于任何數(shù)字都違反了規(guī)則,我們將有序標(biāo)志標(biāo)記為 false,我們將使用它來糾正頁面更新的順序。更新該頁面行/更新中的頁面后,我們需要添加頁面更新正確順序的中間元素的分?jǐn)?shù)。

47|53
97|13
97|61
97|47
75|29
61|13
75|53
29|13
97|29
53|29
61|53
97|53
61|29
47|13
75|47
97|75
47|61
75|61
47|29
75|13
53|13

75,47,61,53,29
97,61,53,29,13
75,29,13
75,97,47,61,53
61,13,29
97,13,75,29,47

我們需要實現(xiàn) CorrectPageOrder 函數(shù),該函數(shù)接受頁面行或頁面更新和規(guī)則,我們需要創(chuàng)建一個新的頁面更新,它將填充遵循所有規(guī)則的頁面。

因此,我們首先跟蹤初始化的元素索引,如果需要移動它之前的元素,則更新索引。

因此,我們迭代頁面更新中的所有數(shù)字,并在規(guī)則中的任何數(shù)字之前設(shè)置索引,如果我們在規(guī)則映射中遇到任何此類數(shù)字,我們需要使用該數(shù)字的索引來更新索引。

一旦我們獲得了要交換元素的索引,我們就在該索引之前創(chuàng)建一個切片并將該數(shù)字附加到其中,并在該索引之后附加所有內(nèi)容。

func ReadFileSections(path string) [][][]int {

    fileBytes := ReadFileBytes(path)
    lines := []string{}
    separator := []byte("\n\n")
    for _, line := range bytes.Split(fileBytes, separator) {
        if string(line) != "" {
            lines = append(lines, string(line))
        }
    }

    sections := [][][]int{}
    for i, section := range lines {
        nums := [][]int{}
        lineStrs := strings.Split(section, "\n")
        separator := ","
        if i == 0 {
            separator = "|"
        }
        for _, lineStr := range lineStrs {
            if lineStr == "" {
                continue
            }
            numL := []int{}
            for _, numStr := range strings.Split(lineStr, separator) {
                num, _ := strconv.Atoi(numStr)
                numL = append(numL, num)
            }
            nums = append(nums, numL)
        }
        sections = append(sections, nums)
    }
    return sections
}

因此,這個函數(shù)將找到一個數(shù)字的索引,將其放置在最左邊(列表的開頭),這樣我們就不會違反該數(shù)字的任何規(guī)則,然后我們創(chuàng)建一個切片來將該數(shù)字附加到之前該索引并附加該索引后的所有內(nèi)容。

第二部分就是這樣,如果頁面順序有任何差異,我們已經(jīng)更新了頁面順序。

您可以在 GitHub 上查看我的解決方案。

Advent of Code ay n Golang: Ordering Pages 破壞先生 / 代碼出現(xiàn)

代碼的出現(xiàn)

結(jié)論

所以,這就是 Golang 代碼降臨的第五天,如果您有任何建議,以及您是如何實現(xiàn)的,請告訴我。有更好的解決方案嗎?

快樂編碼:)

以上是Golang 代碼的出現(xiàn):排序頁面的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

默認(rèn)情況下,GO靜態(tài)鏈接的含義是什么? 默認(rèn)情況下,GO靜態(tài)鏈接的含義是什么? Jun 19, 2025 am 01:08 AM

Go默認(rèn)將程序編譯為獨立二進(jìn)制文件,主要原因是靜態(tài)鏈接。1.部署更簡單:無需額外安裝依賴庫,可直接跨Linux發(fā)行版運行;2.二進(jìn)制體積更大:包含所有依賴導(dǎo)致文件尺寸增加,但可通過構(gòu)建標(biāo)志或壓縮工具優(yōu)化;3.更高的可預(yù)測性與安全性:避免外部庫版本變化帶來的風(fēng)險,增強(qiáng)穩(wěn)定性;4.運行靈活性受限:無法熱更新共享庫,需重新編譯部署以修復(fù)依賴漏洞。這些特性使Go適用于CLI工具、微服務(wù)等場景,但在存儲受限或依賴集中管理的環(huán)境中需權(quán)衡取舍。

如何在GO中創(chuàng)建緩沖頻道? (例如,make(chan int,10)) 如何在GO中創(chuàng)建緩沖頻道? (例如,make(chan int,10)) Jun 20, 2025 am 01:07 AM

在Go中創(chuàng)建緩沖通道只需在make函數(shù)中指定容量參數(shù)即可。緩沖通道允許發(fā)送操作在沒有接收者時暫存數(shù)據(jù),只要未超過指定容量,例如ch:=make(chanint,10)創(chuàng)建了一個可存儲最多10個整型值的緩沖通道;與無緩沖通道不同,發(fā)送數(shù)據(jù)時不會立即阻塞,而是將數(shù)據(jù)暫存于緩沖區(qū)中,直到被接收者取走;使用時需注意:1.容量設(shè)置應(yīng)合理以避免內(nèi)存浪費或頻繁阻塞;2.需防止緩沖區(qū)無限堆積數(shù)據(jù)導(dǎo)致內(nèi)存問題;3.可用chanstruct{}類型傳遞信號以節(jié)省資源;常見場景包括控制并發(fā)數(shù)量、生產(chǎn)者-消費者模型及異

在沒有C中的手動內(nèi)存管理的情況下,如何確保內(nèi)存安全性? 在沒有C中的手動內(nèi)存管理的情況下,如何確保內(nèi)存安全性? Jun 19, 2025 am 01:11 AM

Goensuresmemorysafetywithoutmanualmanagementthroughautomaticgarbagecollection,nopointerarithmetic,safeconcurrency,andruntimechecks.First,Go’sgarbagecollectorautomaticallyreclaimsunusedmemory,preventingleaksanddanglingpointers.Second,itdisallowspointe

如何使用GO進(jìn)行系統(tǒng)編程任務(wù)? 如何使用GO進(jìn)行系統(tǒng)編程任務(wù)? Jun 19, 2025 am 01:10 AM

Go是系統(tǒng)編程的理想選擇,因為它結(jié)合了C等編譯型語言的性能與現(xiàn)代語言的易用性和安全性。1.文件與目錄操作方面,Go的os包支持創(chuàng)建、刪除、重命名及檢查文件和目錄是否存在,使用os.ReadFile可一行代碼讀取整個文件,適用于編寫備份腳本或日志處理工具;2.進(jìn)程管理方面,通過os/exec包的exec.Command函數(shù)可執(zhí)行外部命令、捕獲輸出、設(shè)置環(huán)境變量、重定向輸入輸出流以及控制進(jìn)程生命周期,適合用于自動化工具和部署腳本;3.網(wǎng)絡(luò)與并發(fā)方面,net包支持TCP/UDP編程、DNS查詢及原始套

如何在GO中的結(jié)構(gòu)實例上調(diào)用方法? 如何在GO中的結(jié)構(gòu)實例上調(diào)用方法? Jun 24, 2025 pm 03:17 PM

在Go語言中,調(diào)用結(jié)構(gòu)體方法需先定義結(jié)構(gòu)體和綁定接收者的方法,使用點號訪問。定義結(jié)構(gòu)體Rectangle后,可通過值接收者或指針接收者聲明方法;1.使用值接收者如func(rRectangle)Area()int,通過rect.Area()直接調(diào)用;2.若需修改結(jié)構(gòu)體,應(yīng)使用指針接收者如func(r*Rectangle)SetWidth(...),Go會自動處理指針與值的轉(zhuǎn)換;3.嵌入結(jié)構(gòu)體時,內(nèi)嵌結(jié)構(gòu)體的方法會被提升,可直接通過外層結(jié)構(gòu)體調(diào)用;4.Go無需強(qiáng)制使用getter/setter,字

GO中的接口是什么?如何定義它們? GO中的接口是什么?如何定義它們? Jun 22, 2025 pm 03:41 PM

在Go語言中,接口是一種定義行為而不指定實現(xiàn)方式的類型。接口由方法簽名組成,任何實現(xiàn)這些方法的類型都自動滿足該接口。例如,定義一個Speaker接口包含Speak()方法,則所有實現(xiàn)該方法的類型均可視為Speaker。接口適用于編寫通用函數(shù)、抽象實現(xiàn)細(xì)節(jié)和測試中使用mock對象。定義接口使用interface關(guān)鍵字并列出方法簽名,無需顯式聲明類型實現(xiàn)了接口。常見用例包括日志、格式化、不同數(shù)據(jù)庫或服務(wù)的抽象,以及通知系統(tǒng)等。例如,Dog和Robot類型均可實現(xiàn)Speak方法,并傳遞給同一個Anno

如何在GO中使用字符串軟件包中的字符串函數(shù)? (例如len(),strings.contains(),strings.index(),strings.replaceall()) 如何在GO中使用字符串軟件包中的字符串函數(shù)? (例如len(),strings.contains(),strings.index(),strings.replaceall()) Jun 20, 2025 am 01:06 AM

在Go語言中,字符串操作主要通過strings包和內(nèi)置函數(shù)實現(xiàn)。1.strings.Contains()用于判斷字符串是否包含子串,返回布爾值;2.strings.Index()可查找子串首次出現(xiàn)的位置,若不存在則返回-1;3.strings.ReplaceAll()能替換所有匹配的子串,還可通過strings.Replace()控制替換次數(shù);4.len()函數(shù)用于獲取字符串字節(jié)數(shù)長度,但處理Unicode時需注意字符與字節(jié)的區(qū)別。這些功能常用于數(shù)據(jù)過濾、文本解析及字符串處理等場景。

如何使用IO軟件包在GO中使用輸入和輸出流? 如何使用IO軟件包在GO中使用輸入和輸出流? Jun 20, 2025 am 11:25 AM

TheGoiopackageprovidesinterfaceslikeReaderandWritertohandleI/Ooperationsuniformlyacrosssources.1.io.Reader'sReadmethodenablesreadingfromvarioussourcessuchasfilesorHTTPresponses.2.io.Writer'sWritemethodfacilitateswritingtodestinationslikestandardoutpu

See all articles