Summary Ranges
Given a sorted integer array without duplicates, return the summary of its ranges.
For example:
1 2 3 4 5
| Given [0,1,2,4,5,7], return ["0->2","4->5","7"].
|
提示 |
解題應用 |
Array |
Array/Slice |
Default:
1 2 3
| func summaryRanges(nums []int) []string { }
|
解答思路:
要將數列中的連續範圍給一一分別歸納出來,就只要一邊遍歷一邊確認當下的數字是否與前一個連續,如果是就更新先前所儲存的範圍,一直到發現不為連續的數字才又新增一個新的範圍,並將其值做為範圍的起始值,待遍歷結束後便回傳歸納出的各別範圍結果。
程式碼解說:
一開始先判斷數列是否為空,如果是便回傳空的字串陣列,否則就先將第一個數字放入計數器之中,再將其轉為字串型別做為範圍的起始值,並記得放入結果陣列之中做為初始的範圍,接著從數列的第二個值開始遍歷,不過因為是要核對當下的數字是否與前一個連續(比較前一個數+1是否與其相同),所以遍歷之前還要記得再將計數器+1以利後續比較,如果為連續的數字就更新先前所儲存的範圍(更新範圍的結尾值),一直到發現不為連續的數字才又新增一個新的範圍,並將其值做為範圍與計數器的起始值,待遍歷結束後便回傳歸納出的各別範圍結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| if len(nums) == 0 { return []string{} } count := nums[0] start := strconv.Itoa(count) ranges := []string{start} count++ for _, v := range nums[1:] { if v == count { ranges[len(ranges)-1] = start + "->" + strconv.Itoa(v) } else { start = strconv.Itoa(v) ranges = append(ranges, start) count = v } count++ } return ranges
|
完整程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| func summaryRanges(nums []int) []string { if len(nums) == 0 { return []string{} } count := nums[0] start := strconv.Itoa(count) ranges := []string{start} count++ for _, v := range nums[1:] { if v == count { ranges[len(ranges)-1] = start + "->" + strconv.Itoa(v) } else { start = strconv.Itoa(v) ranges = append(ranges, start) count = v } count++ } return ranges }
|
總結:
有一經由排序並不包含重覆值的數列,要將數列中的連續範圍給一一分別歸納出來,就只要一邊遍歷一邊確認當下的數字是否與前一個連續,如果是就更新先前所儲存的範圍,一直到發現不為連續的數字才又新增一個新的範圍,並將其值做為範圍的起始值,待遍歷結束後便回傳歸納出的各別範圍結果。