如何打印下面给出的数字? [英] how to print the number like given below?

查看:66
本文介绍了如何打印下面给出的数字?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

例如,我给出的输入类似于1,2,3,4,5,6,7,9,10,11,13,15,16,17,18。这个输出应该是1-7,9-11,13,15-18。请帮我拿出这个输出。



问候,

David

For example, i have given input like a 1,2,3,4,5,6,7,9,10,11,13,15,16,17,18. for this output should be 1-7,9-11,13,15-18. please help me out to get this output.

Regards,
David

推荐答案

这是一个天真的解决方案,但它可能适合你;

This is a naive solution but it might work for you;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Numbers {

    public struct Region {
        public int From;
        public int To;

        public Region(int from, int to) {
            From = from;
            To = to;
        }
        public override string ToString() {
            if (From != To)
                return String.Format("{0}-{1}", From, To);
            else
                return String.Format("{0}", From);
        }
    }

    class Program {
        static IEnumerable<Region> FindRegions(IEnumerable<int> series) {
            int? start = null;
            int last = 0;
            foreach (int n in series.OrderBy(v => v)) {
                if (!start.HasValue) {
                    start = n;
                }
                else {
                    if (n - last > 1) {
                        System.Diagnostics.Debug.WriteLine(n);
                        yield return new Region(start.Value, last);
                        start = n;
                    }
                }
                last = n;
            }

            yield return new Region(start.Value, last);
        }

        static void Main(string[] args) {
            string input = "1,2,3,4,5,6,7,9,10,11,13,15,16,17,18";
            var numbers = input.Split(',').Select(s => Convert.ToInt32(s));
            var regions = FindRegions(numbers);
            string output = String.Join(",", regions);
            Console.WriteLine(output);
        }
    }
}



希望这会有所帮助,

Fredrik


Hope this helps,
Fredrik


一种类似但更直接的方法。

A similar, but more straight forward method.
string input = "1,2,3,4,5,6,7,9,10,11,13,15,16,17,18";
var numbers = input.Split(',').Select(s => int.Parse(s)).OrderBy(n => n);

int start = int.MaxValue;
int current = 0;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < numbers.Count(); i++)
{
    current = numbers.ElementAt(i);
    if (current < start)
        start = current;

    if ((i + 1 == numbers.Count()) || (numbers.ElementAt(i + 1) > current + 1))
    {
        if (start == current)
            sb.AppendFormat("{0},", start);
        else
            sb.AppendFormat("{0}-{1},", start, current);
        start = int.MaxValue;
    }
}
string output = sb.ToString().TrimEnd(',');


这篇关于如何打印下面给出的数字?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆