跳到主要内容

228.汇总区间

链接:228.汇总区间
难度:Easy
标签:数组
简介:给定一个无重复元素的有序整数数组 nums 。返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。

题解 1 - typescript

  • 编辑时间:2021-01-10
  • 执行用时:104ms
  • 内存消耗:40.2MB
  • 编程语言:typescript
  • 解法介绍:遍历一遍进行计算。
function summaryRanges(nums: number[]): string[] {
const stack: [number, number][] = [];
for (const num of nums) {
if (stack.length === 0) {
stack.push([num, num]);
} else {
const v = stack[stack.length - 1];
if (num === v[1] + 1) {
v[1] = num;
} else {
stack.push([num, num]);
}
}
}
return stack.map(([num1, num2]) => (num1 === num2 ? num1 + '' : `${num1}->${num2}`));
}

题解 2 - cpp

  • 编辑时间:2023-08-26
  • 内存消耗:6.65MB
  • 编程语言:cpp
  • 解法介绍:遍历。
class Solution {
public:
vector<string> summaryRanges(vector<int>& nums) {
vector<string> res;
if (nums.size() == 0) return res;
bool prev = false;
pair<int, int> cur;
for (auto &num : nums) {
if (!prev) {
prev = true;
cur = make_pair(num, num);
} else if (cur.second + 1 == num) {
cur.second = num;
} else {
string item = cur.first == cur.second ? to_string(cur.first) : to_string(cur.first) + "->" + to_string(cur.second);
res.push_back(item);
cur = make_pair(num, num);
}
}
if (prev) {
string item = cur.first == cur.second ? to_string(cur.first) : to_string(cur.first) + "->" + to_string(cur.second);
res.push_back(item);
}
return res;
}
};

题解 3 - python

  • 编辑时间:2023-08-26
  • 执行用时:48ms
  • 内存消耗:15.72MB
  • 编程语言:python
  • 解法介绍:同上。
class Solution:
def summaryRanges(self, nums: List[int]) -> List[str]:
if not len(nums):
return []
res = []
prev = False
cur = (0, 0)
for num in nums:
if not prev:
prev = True
cur = (num, num)
elif cur[1] + 1 == num:
cur = (cur[0], num)
else:
item = str(cur[0]) if cur[0] == cur[1] else str(cur[0]) + "->" + str(cur[1])
res.append(item)
cur = (num, num)
if prev:
item = str(cur[0]) if cur[0] == cur[1] else str(
cur[0]) + "->" + str(cur[1])
res.append(item)
return res

题解 4 - rust

  • 编辑时间:2023-08-26
  • 内存消耗:2.13MB
  • 编程语言:rust
  • 解法介绍:同上。
impl Solution {
pub fn summary_ranges(nums: Vec<i32>) -> Vec<String> {
let mut res = vec![];
if !nums.is_empty() {
let mut prev = false;
let mut cur = (0, 0);
for num in nums {
if !prev {
prev = true;
cur = (num, num);
} else if cur.1 + 1 == num {
cur.1 = num;
} else {
let item = if cur.0 == cur.1 {
cur.0.to_string()
} else {
let mut s = String::new();
s.push_str(&cur.0.to_string());
s.push_str("->");
s.push_str(&cur.1.to_string());
s
};
res.push(item);
cur = (num, num);
}
}
if prev {
let item = if cur.0 == cur.1 {
cur.0.to_string()
} else {
let mut s = String::new();
s.push_str(&cur.0.to_string());
s.push_str("->");
s.push_str(&cur.1.to_string());
s
};
res.push(item);
}
}
res
}
}