leetcode刷题日记——Summary Ranges
1.题目内容:
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"].
2.题目理解
题目主要意思就是给定一个已经排序好了并且没有重复的数组,通过扫描这个数组,给出这个数组元素范围总结概括。在一组两两之间差距为1的一组元素中,范围为开始那个数组到最后那个数字。例如:0,1,2,3,4,5 它的范围就是0->5,;如果某个数字与前后的数字差值都大于1,则它的范围就是它本身;例如for example中的7。
3.思路
首先,默认第一个范围的开始元素(start)和结尾元素(end)就是数组的第0个元素。然后逐个与后面的元素比较,一旦某个元素与前面的元素差值大于1,就产生从把从start到end形成一个新的返回。
4.实现代码:
import java.util.ArrayList;
import java.util.List;
public class CopyOfSummaryRanges {
public static void main(String[] args) {
CopyOfSummaryRanges summary = new CopyOfSummaryRanges();
int[] nums = { 0, 1, 2, 4, 5, 7, 9 };
List<String> list = summary.summaryRanges(nums);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
public List<String> summaryRanges(int[] nums) {
if (nums == null) {
return null;
}
if (nums.length <= 0) {
return new ArrayList<String>();
}
List<String> list = new ArrayList<String>();
if (nums.length == 1) {
list.add(nums[nums.length - 1] + "");
return list;
}
// 正常情况下的业务逻辑
int start = nums[0], end = nums[0];
for (int i = 1; i < nums.length; i++) {
//如果两个数相连 就将end向后移动
if (nums[i] - nums[i - 1] == 1) {
end = nums[i];
} else {
//如果前后两个数字不相连 也就是范围需要分开 这个时候就开始将前面的start和end形成一个新的返回总结
if (start != end)
list.add("" + start + "->" + end);
else
list.add("" + start);
//对于start和end重新定位
start = nums[i];
end = nums[i];
}
if (i == nums.length - 1) {
if (start == end) {
list.add("" + start);
} else {
list.add("" + start + "->" + end);
}
}
}
return list;
}
}