显示1,2,3,4,5,6,8,10,11为1-6,8,10-11

Bil*_*lla 16 c# java algorithm logic

我有这个序列1,2,3,4,5,6,8,10,11

预期产量为1-6,8,10-11

这个问题是关于以易读的形式格式化序列

我尝试使用c#并使用了许多if&else.

采访者说,有一些简单的算法可以做到这一点.

我不知道如何实现这一点非常简单.

同样对于1,2,3我显示1-3.他们说错了!

这个逻辑中是否涉及任何设计模式(解释器)?

Iva*_*n G 16

这是一种方法:

        int[] numbers = { 1, 2, 3, 4, 5, 6, 8, 10, 11 };

        int start, end;
        for (int i = 0; i < numbers.Length; i++)
        {
            start = numbers[i];

            while (i < numbers.Length - 1 && numbers[i] + 1 == numbers[i + 1])
                i++;

            end = numbers[i];

            if(start == end)
                Console.WriteLine(start);
            else
                Console.WriteLine(start + " - " + end);
        }
Run Code Online (Sandbox Code Playgroud)

这将显示随后作为范围递增的后续数字.未线性增加的数字不会写为范围的一部分.

这是第一种方法的另一个版本,它使用相同的for循环来迭代范围:

        int temp = numbers[0], start, end;
        for (int i = 0; i < numbers.Length; i++)
        {
            start = temp;

            if (i < numbers.Length - 1 )
                // if subsequent numbers are incremental loop further
                if (numbers[i] + 1 == numbers[i + 1])
                    continue;
                // if they are not, number at index i + 1 is a new 'start' for the next iteration
                else
                    temp = numbers[i + 1];

            end = numbers[i];

            if (start == end)
                Console.WriteLine(start);
            else
                Console.WriteLine(start + " - " + end);
        }
Run Code Online (Sandbox Code Playgroud)


Dan*_*rth 5

C#中的一个简单实现可能如下所示:

public string Format(IEnumerable<int> input)
{
    var result = string.Empty;

    var previous = -1;
    var start = -1;
    var first = true;

    foreach(var i in input)
    {
        if(start == -1)
            start = i;
        else if(previous + 1 != i)
        {
            result += FormatRange(start, previous, first);
            first = false;
            start = i;
        }

        previous = i;
    }

    if(start != -1)
        result += FormatRange(start, previous, first);

    return result;
}

public string FormatRange(int start, int end, bool isFirst)
{
    var result = string.Empty;
    if(!isFirst)
        result += ", ";
    if(start == end)
        result += start;
    else
        result += string.Format("{0}-{1}", start, end);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

这也将输出1-3输入1,2,3,这是完全有效的.如果没有规范,输出应该是什么,而不是回答那个部分.