未分類

Summary Ranges

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
}

總結:

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

分享到