序列

序列

簡單

說明

給定一個數字字串,請依這些子字串出現的順序,輸出該字串中所有長度為n的連續子字串。

例如,字串「49142」有以下這些 3 位數的數列:

  • 「491」
  • 「914」
  • 「142」

以及以下這些 4 位數的數列:

  • 「4914」
  • 「9142」

如果你向一個 5 位數的字串要求 6 位數的數列,那不管得到什麼,都怨不得別人。

請注意,這些數列只需要佔據輸入中_相鄰的位置_;這些數字不需要在_數值上連續_。

實作

定義兩個函式:(兩個?沒錯,有時候我們會對 Go 有更多要求。)

All會回傳一個陣列,包含s中所有長度為n的子字串。

All(n int, s string) []string

UnsafeFirst會回傳s中長度為n的第一個子字串。

UnsafeFirst(n int, s string) string

到這裡,你可以認為這個練習已經完成,繼續往下走了。

但是等等,也許你會問一個很合理的問題:為什麼這個函式叫做Unsafe First?如果你有興趣,就繼續往下讀,看看額外的練習吧。

額外練習

當你讓go test通過之後,試試go test -tags asktoomuch吧。 這會使用一個_建置標籤_來啟用先前沒有啟用的測試。 建置標籤可以讓套件選擇要使用哪些檔案。 在這裡,它會控制要使用哪些測試檔案。 你可以在 the Go documentation 讀到更多相關資訊。

你可能會發現,你沒辦法讓這個 asktoomuch 測試通過。 我們需要一種方式來表示:在某些情況下,你無法取得字串的前 N 個字元。 UnsafeFirst只會回傳一個字串,所以做不到這件事。

為了解決這個問題,我們讓這個函式多回傳一個值吧。 定義First(int, string) (first string, ok bool),並用go test -tags first測試。

ok bool這個第二個回傳引數,是 Go 中常見且慣用的模式。 例如,你可以在 Map lookups 和 type assertions 中看到這種做法。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Go Exercism

準備好開始 序列 了嗎?

註冊 Exercism,透過 34 個概念165 個練習 和真人引導來學習並精通 Go,全部免費。