
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 }
 | 
總結:
有一經由排序並不包含重覆值的數列,要將數列中的連續範圍給一一分別歸納出來,就只要一邊遍歷一邊確認當下的數字是否與前一個連續,如果是就更新先前所儲存的範圍,一直到發現不為連續的數字才又新增一個新的範圍,並將其值做為範圍的起始值,待遍歷結束後便回傳歸納出的各別範圍結果。