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"].

接口:public List<String> summaryRanges(int[] nums);

2 思路

给定一个排序好的数组,无重复的元素,返回这个数组的范围。看示例容易理解。
顺序扫描一遍数组,用2个指针 startend来记录每一小段的范围,分割点是nums[end + 1] == nums[end] + 1),满足此条件,end指针往后移动。
细节:处理好数组的最后一个元素:若到了最后一个元素,不进行判断nums[end + 1] == nums[end] + 1),直接进入范围的统计处理。

复杂度: Time O(N); Space: O(1)

3 代码

       public List<String> summaryRanges(int[] nums) {
		final int len = nums.length;
		List<String> result = new LinkedList<String>();
		for (int start = 0, end = 0; end < len;) {
			if ((end + 1 < len) && (nums[end + 1] == nums[end] + 1)) {
				end++;
			} else {
				if (start == end) {
					result.add(Integer.toString(nums[start]));
				} else {
					result.add(nums[start] + "->" + nums[end]);
				}
				end++;
				start = end;
			}
		}
		return result;
	}

4 总结

题目简单,思路清晰,注意代码的细节。

5 扩展

如果数组中有重复的元素,又该如何做?

  • 多添加一个判断:nums[end + 1] == nums[end] + 1 或者 nums[end + 1] == nums[end],满足条件,end指针往后移动一位。

6 参考

原文地址:https://www.cnblogs.com/byrhuangqiang/p/4633057.html