228. 汇总区间
原题:https://leetcode.cn/problems/summary-ranges/description/
题目描述:
给定一个无重复元素的有序整数数组
nums。
区间[a,b]是从a到b(包含)的所有整数的集合。
返回恰好覆盖数组中所有数字的最小有序区间范围列表 。也就是说,nums的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个区间但不属于nums的数字x。
列表中的每个区间范围[a,b]应该按如下格式输出:
"a->b",如果a != b"a",如果a == b
思路还是用一个 map 来记录每个区间的范围,键为区间终点,值为区间起点和终点元组。使用Enum.reduce/3先将数组转换成区间列表,再将区间列表转换成字符串格式。每一步处理通过管道连接,elixir 求解如下:
def summary_ranges(nums) do nums |> Enum.reduce(%{}, fn x, acc -> case Map.fetch(acc, x-1) do {:ok, {s,e}} -> acc |> Map.delete(x-1) |> Map.put(x, {s,x}) _ -> Map.put(acc, x, {x,x}) end end) |> Map.values |> Enum.map(fn {s, s} -> "#{s}" {s, t} -> "#{s}->#{t}" end) end