问题描述
我有一个已排序的数字列表,想要打印连续数字范围,如果系列中缺少任何数字,我们将开始一个新范围。 注意:系列中可能会连续丢失多个数字。 例如:
Input:
list = {301,302,303,304,305,307,308,310,312,318,319,322,390}
Output: range
301 - 305 //306 is missing so it breaks and new range starts
307 - 308 //309 is missing so breaks
310 // 311 is missing so breaks
312 // 313,314,315,316,317 are missing break (1 or more number can be missed)
318 - 319
322
390
我的逻辑:
int count = list.get(0);
String output = list.get(0) + "-";
for(int n: list){
if(count++ != n){
output = output+(count-2);
System.out.println(output);
output = n+"-";
count++;
}
}
这是失败的,如果之间有2个以上的数字缺失。
解决方法
我将使用两个int
来跟踪每个范围的开始和结束。遍历该列表,只要下一个数字是末尾的下一个数字,它将成为新的末尾。如果不是,则手头有一个新范围:
public static void main(String[] args) {
int[] list = {301,302,303,304,305,307,308,310,312,318,319,322,390};
int start = list[0];
int end = list[1];
for (int i = 2; i < list.length; ++i) {
if (end + 1 == list[i]) {
end++;
} else {
printRange(start,end);
start = list[i];
end = list[i];
}
}
printRange(start,end);
}
private static void printRange(int start,int end) {
if (start != end) {
System.out.println(start + " - " + end);
}
else {
System.out.println(start);
}
}
,
您可以避免使用count
,而只与最后一个值进行比较。伪代码:
start = 0
for (i=1; i<=n; i++) {
if ((i==n) || (list[i]!=list[i-1]+1)) {
output interval list[start] - list[i-1]
//omit the second if i-1==start
start = i
}
}
,
这是python中的简单逻辑-
list = [301,390]
def printRange(list):
n = len(list)
i = 0
while i < n:
flag = False
j = i
k = 0
# Assuming the sequence is,difference between each number is 1
while j + 1 < n and list[j] + 1 == list[j + 1]:
j += 1
k += 1
flag = True
if flag:
print('{} - {}'.format(list[i],list[j]))
i += k + 1
else:
print(list[i])
i += 1
printRange(list)
,
我们使用双指针来确定序列是否连续。
public static void main(String[] args) {
int[] arr = {301,390};
printRange(arr);
}
private static void printRange(int[] arr) {
int pre = arr[0];
int start = arr[0];
for (int i = 1; i < arr.length; i++) {
while (i < arr.length - 1 && arr[i] == pre + 1) {
pre = arr[i];
i++;
}
// deal with last number
if (i == arr.length - 1) {
if (arr[i] == pre + 1) {
System.out.println(start + " - " + arr[i]);
} else {
System.out.println(start);
System.out.println(arr[i]);
}
break;
}
if (pre != start) {
System.out.println(start + " - " + pre);
} else {
System.out.println(start);
}
pre = arr[i];
start = arr[i];
}
}