微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

打印范围如果缺少数字

如何解决打印范围如果缺少数字

我有一个已排序的数字列表,想要打印连续数字范围,如果系列中缺少任何数字,我们将开始一个新范围。 注意:系列中可能会连续丢失多个数字。 例如:

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];
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。