首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将1,2,3,4,5,6,8,10,11显示为1-6,8,10-11

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

Stack Overflow用户
提问于 2013-02-19 16:18:08
回答 10查看 11K关注 0票数 16

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

预期输出为1-6,8,10-11

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

我尝试了c#,并使用了很多if & else。

面试官说,有一些简单的算法可以做到这一点。

我不知道如何简单地实现这一点。

对于1,2,3,我也显示了1-3的

。他们说错了!

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

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2013-02-19 16:34:41

这里有一种方法:

代码语言:javascript
复制
        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);
        }

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

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

代码语言:javascript
复制
        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);
        }
票数 16
EN

Stack Overflow用户

发布于 2013-02-19 16:35:13

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

代码语言:javascript
复制
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;
}

这也将为输入1,2,3输出1-3,这是完全有效的。如果没有说明,输出应该是什么,就不可能回答这一部分。

票数 5
EN

Stack Overflow用户

发布于 2013-02-19 18:07:43

可能不是面试问题的合适答案,但使用LINQ是解决这个问题的另一种方法。

代码语言:javascript
复制
int[] numbers = { 1, 2, 3, 4, 5, 6, 8, 10, 11 };
var remains = numbers.AsEnumerable();

while (remains.Any())
{
    int first = remains.First();
    int last = remains.TakeWhile((x, i) => x - first == i).Last();
    remains = remains.Skip(last - first + 1);
    Console.Write(first + (first == last ? "" : "-" + last) + (remains.Any() ? "," : Environment.NewLine));
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14952818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档