题意: Given a sorted integer array without duplicates, return the summary of its ranges.
For example, given [0,1,2,4,5,7], return [“0->2”,”4->5”,”7”].
思路:这题我想的还是使用双指针来做,但是要考虑的东西有点多,所以代码会显得有些繁琐。
class Solution(object):
def summaryRanges(self, nums):
"""
:type nums: List[int]
:rtype: List[str]
"""
i, j = 0, 1
ans = []
if not nums:
return ans
while j<len(nums):
if nums[j] != nums[j-1]+1 and j == i+1:
ans.append(str(nums[i]))
i = j
elif nums[j] != nums[j-1]+1 and j!=i+1:
ans.append(str(nums[i])+'->'+str(nums[j-1]))
i = j
j += 1
if j == i+1:
ans.append(str(nums[-1]))
else:
ans.append(str(nums[i])+'->'+str(nums[-1]))
return ans
这里还有一个别人的更简单的代码:
class Solution:
# @param {integer[]} nums
# @return {string[]}
def summaryRanges(self, nums):
ranges = []
if not nums:
return ranges
start, end = nums[0], nums[0]
for i in xrange(1, len(nums) + 1):
if i < len(nums) and nums[i] == end + 1:
end = nums[i]
else:
interval = str(start)
if start != end:
interval += "->" + str(end)
ranges.append(interval)
if i < len(nums):
start = end = nums[i]
return ranges
后来还在discuss里看到两端神代码,第一个是:
def summaryRanges(self, nums):
ranges = []
for n in nums:
if not ranges or n > ranges[-1][-1] + 1:
ranges += [],
ranges[-1][1:] = n,
return ['->'.join(map(str, r)) for r in ranges]
仔细观察有两段代码后面有两个逗号,这个逗号很关键啊,ranges+=[],使ranges成为了[[]],而如果你不加逗号的话,ranges的结果还是[],据说这是因为逗号的的关系,[]被当成了([],)即元组来处理,要不然给[]的[1:]直接赋n的话是会报错的,还有一段代码:
def summaryRanges(self, nums):
return [re.sub('->.*>', '->', '->'.join(`n` for i, n in g))
for _, g in itertools.groupby(enumerate(nums), lambda (i, n): n-i)]
这个反正打死我也想不出来的。。作者巧妙的利用了数组中连续数和索引的差必定恒为定值,比如:
numbers: [0, 1, 2, 4, 5, 7]
indexes: [0, 1, 2, 3, 4, 5]
subtract: [0, 0, 0, 1, 1, 2]
所以来对他们进行分组,groupby函数的用法参考这个戳我 ,前面的re.sub相当于replace是用正则化来用作取代,把0->0->0转化为0->0,当然结果不是这个,只是这么个意思。