我有这个序列1,2,3,4,5,6,8,10,11,我有这个序列
预期输出为1-6,8,10-11
这个问题是关于以易于阅读的形式格式化序列
我尝试了c#,并使用了很多if & else。
面试官说,有一些简单的算法可以做到这一点。
我不知道如何简单地实现这一点。
对于1,2,3,我也显示了1-3的
。他们说错了!
这个逻辑中是否涉及到任何设计模式(解释器)?
发布于 2013-02-19 16:34:41
这里有一种方法:
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循环来迭代范围:
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);
}发布于 2013-02-19 16:35:13
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;
}这也将为输入1,2,3输出1-3,这是完全有效的。如果没有说明,输出应该是什么,就不可能回答这一部分。
发布于 2013-02-19 18:07:43
可能不是面试问题的合适答案,但使用LINQ是解决这个问题的另一种方法。
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));
}https://stackoverflow.com/questions/14952818
复制相似问题