📜  从数组中找到所有连续数字范围

📅  最后修改于: 2021-05-14 08:14:59             🧑  作者: Mango

给定一个排序数组arr [] ,该数组由N个整数组成,没有重复项,任务是从该数组中查找连续数字的范围。
例子:

方法:这个想法是从初始位置开始遍历数组,对于数组中的每个元素,检查当前元素和上一个元素之间的差异。

  • 如果当前元素与上一个元素之间的差为1,则只需增加length变量即可。我们使用length变量建立范围“ A-> B” 。由于只需要范围,所以我们不需要存储A和B之间的所有元素。我们只需要知道此范围的长度即可。
  • 如果当前元素和上一个元素之间的差不等于1,则将范围的第一个元素和当前的上一个元素之间的范围构建为最后一个范围。

下面是上述方法的实现:

C++
// C++ program to find the ranges of
// consecutive numbers from array
#include
using namespace std;
 
// Function to find consecutive ranges
vector consecutiveRanges(int a[], int n)
{
    int length = 1;
    vector list;
     
    // If the array is empty,
    // return the list
    if (n == 0)
    {
        return list;
    }
     
    // Traverse the array from first position
    for(int i = 1; i <= n; i++)
    {
     
        // Check the difference between the
        // current and the previous elements
        // If the difference doesn't equal to 1
        // just increment the length variable.
        if (i == n || a[i] - a[i - 1] != 1)
        {
     
            // If the range contains
            // only one element.
            // add it into the list.
            if (length == 1)
            {
                list.push_back(to_string(a[i - length]));
            }
            else
            {
     
                // Build the range between the first
                // element of the range and the
                // current previous element as the
                // last range.
                string temp = to_string(a[i - length]) +
                            " -> " + to_string(a[i - 1]);
                list.push_back(temp);
            }
     
            // After finding the first range
            // initialize the length by 1 to
            // build the next range.
            length = 1;
        }
        else
        {
            length++;
        }
    }
    return list;
}
 
// Driver Code.
int main()
{
 
    // Test Case 1:
    int arr1[] = { 1, 2, 3, 6, 7 };
    int n = sizeof(arr1) / sizeof(arr1[0]);
     
    vector ans = consecutiveRanges(arr1, n);
    cout << "[";
    for(int i = 0; i < ans.size(); i++)
    {
        if(i == ans.size() - 1)
            cout << ans[i] << "]" << endl;
        else
            cout << ans[i] << ", ";
    }
     
    // Test Case 2:
    int arr2[] = { -1, 0, 1, 2, 5, 6, 8 };
    n = sizeof(arr2) / sizeof(arr2[0]);
    ans = consecutiveRanges(arr2, n);
     
    cout << "[";
    for(int i = 0; i < ans.size(); i++)
    {
        if(i == ans.size() - 1)
            cout << ans[i] << "]" << endl;
        else
            cout << ans[i] << ", ";
    }
     
    // Test Case 3:
    int arr3[] = { -1, 3, 4, 5, 20, 21, 25 };
    n = sizeof(arr3) / sizeof(arr3[0]);
    ans = consecutiveRanges(arr3, n);
     
    cout << "[";
    for(int i = 0; i < ans.size(); i++)
    {
        if(i == ans.size() - 1)
            cout << ans[i] << "]" << endl;
        else
            cout << ans[i] << ", ";
    }
}
 
// This code is contributed by Surendra_Gangwar


Java
// Java program to find the ranges of
// consecutive numbers from array
 
import java.util.*;
 
class GFG {
 
    // Function to find consecutive ranges
    static List
    consecutiveRanges(int[] a)
    {
        int length = 1;
        List list
            = new ArrayList();
 
        // If the array is empty,
        // return the list
        if (a.length == 0) {
            return list;
        }
 
        // Traverse the array from first position
        for (int i = 1; i <= a.length; i++) {
 
            // Check the difference between the
            // current and the previous elements
            // If the difference doesn't equal to 1
            // just increment the length variable.
            if (i == a.length
                || a[i] - a[i - 1] != 1) {
 
                // If the range contains
                // only one element.
                // add it into the list.
                if (length == 1) {
                    list.add(
                        String.valueOf(a[i - length]));
                }
                else {
 
                    // Build the range between the first
                    // element of the range and the
                    // current previous element as the
                    // last range.
                    list.add(a[i - length]
                             + " -> " + a[i - 1]);
                }
 
                // After finding the first range
                // initialize the length by 1 to
                // build the next range.
                length = 1;
            }
            else {
                length++;
            }
        }
 
        return list;
    }
 
    // Driver Code.
    public static void main(String args[])
    {
 
        // Test Case 1:
        int[] arr1 = { 1, 2, 3, 6, 7 };
        System.out.print(consecutiveRanges(arr1));
        System.out.println();
 
        // Test Case 2:
        int[] arr2 = { -1, 0, 1, 2, 5, 6, 8 };
        System.out.print(consecutiveRanges(arr2));
        System.out.println();
 
        // Test Case 3:
        int[] arr3 = { -1, 3, 4, 5, 20, 21, 25 };
        System.out.print(consecutiveRanges(arr3));
    }
}


Python3
# Python3 program to find
# the ranges of consecutive
# numbers from array
 
# Function to find
# consecutive ranges
def consecutiveRanges(a, n):
 
    length = 1
    list = []
     
    # If the array is empty,
    # return the list
    if (n == 0):
        return list
     
    # Traverse the array
    # from first position
    for i in range (1, n + 1):
     
        # Check the difference
        # between the current
        # and the previous elements
        # If the difference doesn't
        # equal to 1 just increment
        # the length variable.
        if (i == n or a[i] -
            a[i - 1] != 1):
        
            # If the range contains
            # only one element.
            # add it into the list.
            if (length == 1):
                list.append(str(a[i - length]))
            else:
     
                # Build the range between the first
                # element of the range and the
                # current previous element as the
                # last range.
                temp = (str(a[i - length]) +
                        " -> " + str(a[i - 1]))
                list.append(temp)
           
            # After finding the 
            # first range initialize
            # the length by 1 to
            # build the next range.
            length = 1
        
        else:
            length += 1
    return list
 
# Driver Code.
if __name__ == "__main__":
 
    # Test Case 1:
    arr1 = [1, 2, 3, 6, 7]
    n = len(arr1)
     
    ans = consecutiveRanges(arr1, n)
    print ("[", end = "")
    for i in range(len(ans)):
     
        if(i == len(ans) - 1):
            print (ans[i], "]")
        else:
            print (ans[i], end = ", ")
     
    # Test Case 2:
    arr2 = [-1, 0, 1, 2, 5, 6, 8]
    n = len(arr2)
    ans = consecutiveRanges(arr2, n)
     
    print ("[", end = "")
     
    for i in range (len(ans)): 
        if(i == len(ans) - 1):
            print (ans[i], "]")
        else:
            print (ans[i], end = ", ")
   
    # Test Case 3:
    arr3 = [-1, 3, 4, 5, 20, 21, 25]
    n = len(arr3)
    ans = consecutiveRanges(arr3, n)
     
    print ("[", end = "")
     
    for i in range (len(ans)):   
        if(i == len(ans) - 1):
            print (ans[i], "]")
        else:
            print (ans[i], end = ", ")
 
# This code is contributed by Chitranayal


C#
// C# program to find the ranges of
// consecutive numbers from array
using System;
using System.Collections.Generic;
 
class GFG{
 
// Function to find consecutive ranges
static List consecutiveRanges(int[] a)
{
    int length = 1;
    List list = new List();
 
    // If the array is empty,
    // return the list
    if (a.Length == 0)
    {
        return list;
    }
 
    // Traverse the array from first position
    for(int i = 1; i <= a.Length; i++)
    {
 
        // Check the difference between the
        // current and the previous elements
        // If the difference doesn't equal to 1
        // just increment the length variable.
        if (i == a.Length || a[i] - a[i - 1] != 1)
        {
 
            // If the range contains
            // only one element.
            // add it into the list.
            if (length == 1)
            {
                list.Add(
                    String.Join("", a[i - length]));
            }
            else
            {
 
                // Build the range between the first
                // element of the range and the
                // current previous element as the
                // last range.
                list.Add(a[i - length] +
                " -> " + a[i - 1]);
            }
 
            // After finding the first range
            // initialize the length by 1 to
            // build the next range.
            length = 1;
        }
        else
        {
            length++;
        }
    }
    return list;
}
 
static void print(List arr)
{
    Console.Write("[");
    foreach(String i in arr)
        Console.Write(i + ", ");
         
    Console.Write("]");
}
 
// Driver Code.
public static void Main(String []args)
{
 
    // Test Case 1:
    int[] arr1 = { 1, 2, 3, 6, 7 };
    print(consecutiveRanges(arr1));
    Console.WriteLine();
 
    // Test Case 2:
    int[] arr2 = { -1, 0, 1, 2, 5, 6, 8 };
    print(consecutiveRanges(arr2));
    Console.WriteLine();
 
    // Test Case 3:
    int[] arr3 = { -1, 3, 4, 5, 20, 21, 25 };
    print(consecutiveRanges(arr3));
}
}
 
// This code is contributed by Amit Katiyar


输出:
[1 -> 3, 6 -> 7]
[-1 -> 2, 5 -> 6, 8]
[-1, 3 -> 5, 20 -> 21, 25]

时间复杂度: O(N) ,其中N是数组的长度。