欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Go語言如何實現(xiàn)字符串切片反轉函數(shù)

 更新時間:2022年10月19日 10:40:19   作者:宇宙之一粟  
Go?語言不像其他語言如?Python,有著內(nèi)置的?reverse()?函數(shù),本文將先學習一下Python中對于列表的反轉方法,然后再學習如果在Go語言中實現(xiàn)相同的功能,感興趣的小伙伴快跟隨小編一起來學習一下

Python 中的 reverse 函數(shù)

Go 語言不像其他語言如 Python,有著內(nèi)置的 reverse() 函數(shù),先來看一下 Python 中對于列表的反轉方法,然后我們再來學習如果在 Go 語言中實現(xiàn)相同的功能。

>>> myList = [2022, 2021, 2008, 2012]
>>> myList.reverse()
>>> print("Reversed List:", myList)
Reversed List: [2012, 2008, 2021, 2022]
>>> 

實現(xiàn)一個 reverse 反轉函數(shù)

reverse 算法取一個數(shù)據(jù)集,并將該數(shù)據(jù)集的值進行反轉,Go 標準的 sort 包并沒有內(nèi)置的方法來反轉一個切片。

利用兩個切片實現(xiàn)

設計思想:

  • 確定切片長度
  • 獲取最后一個元素
  • 以相反的順序在新切片中添加最后一個元素到第一個位置
package main

import "fmt"

func main() {
    s := []string{"hello", "foo", "bar", "go", "abc", "zzz"}

    // 定義新的反轉切片
    reverseOfS := []string{}

    // 遍歷原切片 s
    for i := range s {
        reverseOfS = append(reverseOfS, s[len(s)-1-i])
    }
    fmt.Println(reverseOfS)
}

運行結果:

[zzz abc go bar foo hello]

顯然,這種方式會額外花費一個相同空間的切片,空間復雜度為 O(n)。

前后兩兩原地交換

我們可以寫一個簡易的 reverse 函數(shù)來進行數(shù)據(jù)的反轉,通過循環(huán)原切片的一半,然后依次與對應的元素進行交換,比如::

func reverse(s []string) []string {
    for i := 0; i < len(s)/2; i++ {
        j := len(s) - i - 1
        s[i], s[j] = s[j], s[i]
    }
    return  s
}

這個函數(shù)可以通過更簡短的實現(xiàn),通過 Go 內(nèi)部的操作進行循環(huán):

package main

import "fmt"

func reverse(s []string) []string {
    for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
        s[i], s[j] = s[j], s[i]
    }
    return s
}

func main() {
    s := []string{"hello", "foo", "bar", "go", "abc", "zzz"}

    reverseOfS := reverse(s)

    fmt.Println(reverseOfS)
}

執(zhí)行結果:

[zzz abc go bar foo hello]

但是,上面的 reverse 函數(shù)都是通過切片按值傳遞,其實我們在修改傳遞中的 []string 切片,實際上,可以通過以下方式進一步簡寫:

package main

import "fmt"

func reverse(s []string) {
    for i := 0; i < len(s)/2; i++ {
        j := len(s) - i - 1
        s[i], s[j] = s[j], s[i]
    }
}

func main() {
    s := []string{"hello", "foo", "bar", "go", "abc", "zzz"}

    reverse(s)
    fmt.Printf("%v\n", s)
}

此時,reverse() 函數(shù)不會返回切片的另一個引用,此時的交換就是就地進行,此時更像文章開頭 Python 中的 reverse() 函數(shù)。

反轉為原切片的副本

如果我們要返回切片的反轉的副本,reverse 函數(shù)就可以這樣寫:

package main

import "fmt"

func reverse(s []string) []string {

    newS := make([]string, len(s))
    for i, j := 0, len(s)-1; i <= j; i, j = i+1, j-1 {
        newS[i], newS[j] = s[j], s[i]
    }
    return newS
}

func main() {
    s := []string{"hello", "foo", "bar", "go", "abc", "zzz"}

    fmt.Printf("原字符串切片:%v\n", s)
    fmt.Printf("反轉后的切片:%v\n", reverse(s))
}

運行結果:

原字符串切片:[hello foo bar go abc zzz]
反轉后的切片:[zzz abc go bar foo hello]

可以看到,原切片是沒有變化的。

當然,因為我們沒有就地修改原切片,因此又可以回到最初的方法 append,看代碼:

func reverse(s []string) []string {

    newS := make([]string, 0, len(s))

    for i := len(s)-1; i >= 0; i-- {
        newS = append(newS, s[i])
    }
    return newS
}

運行結果圖如下:

總結

本文通過 Python 中的 reverse() 函數(shù)的一個示例,引發(fā)出一個思考:Go 語言中有沒有類似的反轉函數(shù)?

然后通過幾種方式實現(xiàn)同樣的字符串切片的反轉功能,并通過借助額外空間和就地反轉兩種方式實現(xiàn)了功能相同 reverse 函數(shù),其實類似的反轉思想也可以用于字符串或者鏈表反轉等其他數(shù)據(jù)結構。

到此這篇關于詳解Go語言如何實現(xiàn)字符串切片反轉函數(shù)的文章就介紹到這了,更多相關Go語言字符串切片反轉函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言使用templ實現(xiàn)編寫HTML用戶界面

    Go語言使用templ實現(xiàn)編寫HTML用戶界面

    templ是一個在 Go 中編寫 HTML 用戶界面的語言,使用 templ,我們可以創(chuàng)建可呈現(xiàn) HTML 片段的組件,下面就跟隨小編一起了解一下具體的實現(xiàn)方法吧
    2023-12-12
  • 使用go讀取gzip格式的壓縮包的操作

    使用go讀取gzip格式的壓縮包的操作

    這篇文章主要介紹了使用go讀取gzip格式的壓縮包的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 淺談Go語言中字符串和數(shù)組

    淺談Go語言中字符串和數(shù)組

    這篇文章主要簡單介紹了Go語言中字符串和數(shù)組的使用方法和申明方式,需要的朋友可以參考下
    2015-01-01
  • GO語言包管理工具go?mod以及包詳解

    GO語言包管理工具go?mod以及包詳解

    go mod是go的一個模塊管理工具,用來代替?zhèn)鹘y(tǒng)的GOPATH方案,下面這篇文章主要給大家介紹了關于GO語言包管理工具go?mod以及包詳解的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • Golang Http 驗證碼示例實現(xiàn)

    Golang Http 驗證碼示例實現(xiàn)

    這篇文章主要介紹了Golang Http 驗證碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • golang簡單tls協(xié)議用法完整示例

    golang簡單tls協(xié)議用法完整示例

    這篇文章主要介紹了golang簡單tls用法,分析了tls協(xié)議的使用步驟及客戶端與服務器端的相關實現(xiàn)代碼,需要的朋友可以參考下
    2016-07-07
  • 使用Golang的gomail庫實現(xiàn)郵件發(fā)送功能

    使用Golang的gomail庫實現(xiàn)郵件發(fā)送功能

    本篇博客詳細介紹了如何使用Golang語言中的gomail庫來實現(xiàn)郵件發(fā)送的功能,首先,需要準備工作,包括安裝Golang環(huán)境、gomail庫,以及申請126郵箱的SMTP服務和獲取授權碼,其次,介紹了在config文件中配置SMTP服務器信息的步驟
    2024-10-10
  • golang正則之命名分組方式

    golang正則之命名分組方式

    這篇文章主要介紹了golang正則之命名分組方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go?復合類型之字典類型使用教程示例

    Go?復合類型之字典類型使用教程示例

    這篇文章主要為大家介紹了Go復合類型之字典類型使用教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 詳解Golang中哪些類型可以作為map的key

    詳解Golang中哪些類型可以作為map的key

    在 Go 語言中,map 是一種內(nèi)置的關聯(lián)數(shù)據(jù)結構類型,由一組無序的鍵值對組成,每個鍵都是唯一的,并與一個對應的值相關聯(lián),本文將詳細介紹哪些類型的變量可以作為 map 的鍵,并通過實例進行說明,感興趣的朋友可以參考下
    2024-01-01

最新評論