所以,這是 Golang 2024 年程式碼來臨的第二天,我們將探索我的方法和解決方案。問題沒那麼容易,但實施後發現很簡單,並發現正確。
您可以在 GitHub 上查看我的解決方案。
我們得到了一些稱為報告的行,每個報告都有許多層級。報告的要求是必須嚴格增加或減少至少1倍或最多3倍。
這意味著如果前兩個元素增加了1,那麼該報告中的其他後續元素也應該增加(增加1、2 或3)級別,並且不能有任何變化(即兩個相鄰元素的變化為0)數字,或兩個相鄰數字不能相同)
7 6 4 2 1 1 2 7 8 9 9 7 6 2 1 1 3 2 4 5 8 6 4 4 1 1 3 6 7 9
我們首先進行輸入解析,這非常簡單,我們需要將其除以n 以獲得單獨的報告,這將是一個字符串,所以”7 6 4 2 1” ,我們想要得到一個切片整數。
所以我們繼續並用空格/空白“”分割以獲得各個級別(數字),我們需要將它們轉換為整數。
一旦我們有了報告的各個字串,即層級為 [“7”, “6”, “4”, “2”, “1”] ,我們需要將它們轉換為整數。
我們迭代它們中的每一個並將它們轉換為整數並附加到列表中。
建立清單後,我們將其追加到報告清單中,該清單將是數組的數組,即每一行都是一個報告,每個報告都有許多級別,因此是整數切片。
func SplitLevels(lines []string) [][]int { reportLevels := [][]int{} for i, reportLine := range lines { reportLevels = append(reportLevels, []int{}) for _, levelStr := range strings.Split(reportLine, " ") { level, err := strconv.Atoi(levelStr) if err != nil { log.Fatal(err) } reportLevels[i] = append(reportLevels[i], level) } } return reportLevels }
一旦我們建立了報告和級別,我們就會繼續實際分析各個報告中級別內的模式。
為此:
我們首先取得單獨的報告,計算前兩個元素之間的差異,並記住在這裡小心使用絕對差異。
我們需要維護一個標誌,指示報告中的等級是增加還是減少,這可以透過前兩個元素來確定。
也就是說,如果前兩個元素增加,則後續等級也應增加,如果它們減少,則所有等級也應減少
我們先進行警衛檢查,如果它們之間的差異是 0 或大於 3 或小於 -3,這是安全等級的條件。如果是這種情況,那麼我們回傳 false,即報告不安全。
我們現在在前兩個元素之後迭代報告,然後計算接下來兩個層級之間的差異,如果標誌正在增加為true 並且當前差異小於或等於0 或超過3 我們也將其標記為false
另一個條件是,如果標誌正在減少,這意味著前兩個元素具有負差,因此我們檢查當前差是否大於或等於0 或小於- 3,如果是這種情況,我們將其標記為false
計算完所有等級的差異後,如果我們退出循環,我們將返回 true,因為我們沒有看到等級中存在任何差異。
7 6 4 2 1 1 2 7 8 9 9 7 6 2 1 1 3 2 4 5 8 6 4 4 1 1 3 6 7 9
對於第二部分,我們需要做一些事情,我們需要計算報告是否安全,如果不安全,我們幾乎可以從報告中刪除一個元素以使其安全。
為此,方法是:
取得我們第一次看到等級差異的索引
透過從報告中刪除該元素進行檢查,如果這使報告安全,則傳回 true,即我們找到了安全報告
如果我們仍然發現報告不安全,請刪除發現差異的索引之前的元素,如果現在我們在刪除該元素後發現它是安全的,則將其標記為安全
如果我們仍然發現報告不安全,則刪除我們最初發現差異的索引後面的元素,如果報告變得安全,我們將該報告標記為安全
否則我們會將報告標記為不安全,因為我們無法找到使報告安全的可移動元素。
func SplitLevels(lines []string) [][]int { reportLevels := [][]int{} for i, reportLine := range lines { reportLevels = append(reportLevels, []int{}) for _, levelStr := range strings.Split(reportLine, " ") { level, err := strconv.Atoi(levelStr) if err != nil { log.Fatal(err) } reportLevels[i] = append(reportLevels[i], level) } } return reportLevels }
您可以在 GitHub 上查看我的解決方案。
這就是它,這是 Golang 代碼 2024 出現的第二天的一個非常簡單的問題。我希望您喜歡 Golang 2024 年代碼降臨中第一天謎題的演練。
如果您有任何其他有趣的解決方案,或您對此有什麼要分享的,歡迎任何回饋、問題或建議。
謝謝您的閱讀,明天第三天見
快樂編碼:)
以上是Code n Golang 的出現:切片和切塊報告的詳細內容。更多資訊請關注PHP中文網其他相關文章!