具体方法:
static short Days()
{
var days = new List<DateTime>
{
Convert.ToDateTime("2016-12-01"),
Convert.ToDateTime("2016-12-04"),
Convert.ToDateTime("2016-12-06"),
Convert.ToDateTime("2016-12-08"),
Convert.ToDateTime("2016-12-09"),
Convert.ToDateTime("2016-12-12"),
Convert.ToDateTime("2016-12-13"),
Convert.ToDateTime("2016-12-14"),
Convert.ToDateTime("2016-12-16"),
Convert.ToDateTime("2016-12-17"),
Convert.ToDateTime("2016-12-18"),
Convert.ToDateTime("2016-12-19"),
Convert.ToDateTime("2016-12-21")
};
var counts = new List<short>();
short a = 0;
for (int i = 0; i < days.Count;)
{
short b = 0;
short max = 1;
for (int j = 0; j < days.Count; j++)
{
if (a + 1 == days.Count) break;
var first = days[i].AddDays(j + 1);
var second = days[a + 1];
if (first == second)
{
max++;
a++;
b++;
}
else
{
a -= b;
break;
}
}
counts.Add(max);
a += max;
i += max;
}
return counts.Max();
}
控制台输出:Console.WriteLine(Days());
//输出结果:
//算法原理:
//第一个元素加1天和第二个元素比较,日期不同的话, 直接跳出循环,从下一个元素继续对比
//第一个元素加1天与第二个元素比较,如果日期相同则最大连续天数加1,然后第二个元素加1天与第三个元素比较,日期相同再加1。依次执行下去,直到有两个元素日期不同,然后跳出循环,将本次循环的连续天数记录到集合
//进行下一次循环的时候,将元素下标加上上一次循环得出的最大连续天数,跳过连续的元素执行循环,减少循环次数。比如集合的第四个元素(2016-12-08)下标是3,它和第五个元素(2016-12-09下标是4)是连续的,那么他们的连续天数就是2,
//那么本次循环结束,执行下一次循环的时候,将第一个for的下标3加上连续的天数2,得出5,那么循环就可以从第六个元素开始了,中间略过了1次循环。同理,如果连续的天数是4,那么就可以省略3次循环了。
//语言组织能力有待提高啊!>_<!!!
欢迎各位讨论指正!