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;) { if (a + 1 == days.Count) break; short b = 0; short max = 1; for (int j = 0; j < days.Count; j++) { 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次循環了。
//語言組織能力有待提高啊!>_<!!!
歡迎各位討論指正!