国产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ī)則,具體來說哪個頁面應該在哪個頁面之前,第二個部分包含頁面的實際順序。

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ù)結構讀取它們。

一種方法是

  • 包含兩個部分的列表

  • 第一部分將是一個列表

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

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

因此,數(shù)據(jù)結構看起來像一個整數(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ī)則行,第二個將包含頁面列表行。

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

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

構建規(guī)則

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

構建指數(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ù)字都應該遵循規(guī)則。這意味著,如果一個數(shù)字在某個數(shù)字之后,但規(guī)則規(guī)定它應該在之前,那么它就違反了該更新中的頁碼規(guī)則,因此我們不能將其視為正確的有序頁面,我們需要添加中間頁面每個更新的編號已正確排序為第一部分的答案。

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

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

當我們發(fā)現(xiàn)該頁面更新的索引規(guī)則被違反時,我們將訂單標記為 false。如果我們看到有序標志仍然為 true,我們會使用該頁面更新的中間元素來更新分數(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ù)列表。我們返回分數(shù)作為該函數(shù)的輸出。

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

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

第2部分

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

我們對第二部分做了類似的事情,我們需要迭代每個頁面更新,并且對于該頁面更新中的每個數(shù)字,我們需要檢查是否違反規(guī)則,如果遇到以下情況對于任何數(shù)字都違反了規(guī)則,我們將有序標志標記為 false,我們將使用它來糾正頁面更新的順序。更新該頁面行/更新中的頁面后,我們需要添加頁面更新正確順序的中間元素的分數(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ù)字之前設置索引,如果我們在規(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)

結論

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

快樂編碼:)

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

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

Go默認將程序編譯為獨立二進制文件,主要原因是靜態(tài)鏈接。1.部署更簡單:無需額外安裝依賴庫,可直接跨Linux發(fā)行版運行;2.二進制體積更大:包含所有依賴導致文件尺寸增加,但可通過構建標志或壓縮工具優(yōu)化;3.更高的可預測性與安全性:避免外部庫版本變化帶來的風險,增強穩(wěn)定性;4.運行靈活性受限:無法熱更新共享庫,需重新編譯部署以修復依賴漏洞。這些特性使Go適用于CLI工具、微服務等場景,但在存儲受限或依賴集中管理的環(huá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中創(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.容量設置應合理以避免內(nèi)存浪費或頻繁阻塞;2.需防止緩沖區(qū)無限堆積數(shù)據(jù)導致內(nèi)存問題;3.可用chanstruct{}類型傳遞信號以節(jié)省資源;常見場景包括控制并發(fā)數(shù)量、生產(chǎn)者-消費者模型及異

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

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

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

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

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

在Go語言中,接口是一種定義行為而不指定實現(xiàn)方式的類型。接口由方法簽名組成,任何實現(xiàn)這些方法的類型都自動滿足該接口。例如,定義一個Speaker接口包含Speak()方法,則所有實現(xiàn)該方法的類型均可視為Speaker。接口適用于編寫通用函數(shù)、抽象實現(xiàn)細節(jié)和測試中使用mock對象。定義接口使用interface關鍵字并列出方法簽名,無需顯式聲明類型實現(xiàn)了接口。常見用例包括日志、格式化、不同數(shù)據(jù)庫或服務的抽象,以及通知系統(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ù)過濾、文本解析及字符串處理等場景。

將Golang服務與現(xiàn)有Python基礎架構集成的策略 將Golang服務與現(xiàn)有Python基礎架構集成的策略 Jul 02, 2025 pm 04:39 PM

TOIntegrategolangServicesWithExistingPypythoninFrasture,userestapisorgrpcForinter-serviceCommunication,允許GoandGoandPyThonAppStoStoInteractSeamlessSeamLlyThroughlyThroughStandArdArdAdrotized Protoccols.1.usererestapis(ViaFrameWorkslikeSlikeSlikeGiningOandFlaskInpyThon)Orgrococo(wirs Propococo)

See all articles