【问题标题】:print range, if number is missing打印范围,如果缺少数字
【发布时间】:2026-02-02 21:35:02
【问题描述】:

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

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 个数字,则失败。

【问题讨论】:

  • 从您的陈述来看,什么代表一个范围以及您使用什么标准来确定要检查哪个数字是否属于一个范围并不明显。请通过给出示例基本案例以更具体的方式陈述您的问题。可能有很多数字不在范围内,如果要检查的数字由数字之间的单个数字间隙标识,那么请明确说明顺序是排序的,并且间隙由缺失的数字标识,说明可以缺失多少个数字.它们可能同时在不同的范围内丢失。你的问题陈述太模棱两可了。
  • 感谢@dmitryro,已更新问题,如果仍有任何困惑,请告诉我。

标签: java arrays list algorithm data-structures


【解决方案1】:

我们使用双指针来判断序列是否连续。

    public static void main(String[] args) {
        int[] arr = {301, 302, 303, 304, 305, 307, 308, 310, 312, 318, 319, 322, 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];
        }
    }

【讨论】:

    【解决方案2】:

    这是python中的简单逻辑-

    list = [301, 302, 303, 304, 305, 307, 308, 310, 312, 318, 319, 322, 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)
    

    【讨论】:

      【解决方案3】:

      您可以避免使用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  
         }
      }
      

      【讨论】:

        【解决方案4】:

        我会使用两个ints 来跟踪每个范围的开始和结束。遍历列表,只要下一个数字是结尾的下一个数字,它就成为新的结尾。如果不是,您手头就有一个新的范围:

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

        【讨论】: