求一个从小到大排序的日期集合中的最大连续天数

本文介绍了一个计算特定日期列表中连续日期数量的算法。通过遍历日期列表并比较相邻日期之间的间隔来确定最大连续天数。
具体方法:
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次循环了。

//语言组织能力有待提高啊!>_<!!!

欢迎各位讨论指正!

转载于:https://www.cnblogs.com/makeke/p/6183738.html

我有一张excel表格,其中一子表‘blotter source’,里面记录了A列=债券的交易日期、B列=债券的名字、C列=债券的交易金额(买入债券金额为正,卖出债券金额为负,单位为元),在另一个子表‘统计’中存有我需要统计的统计时间区间和债券名字,‘统计’表的格式为,A1、A2分别记录统计区间开始日期和结束日期,B列=债券的名字,B列所有债券统一调用A1、A2作为开始日期和结束日期。根据‘统计’表中的债券名字和统计区间,以及‘blotter source’表中的债券交易记录,统计债券在区间内的持仓情况,即找出‘统计’表中债券在统计时间段内的持仓金额和持仓天数,注意每只债券可能有多于2笔的交易记录。我提供一个示例,债券A在25年7月1日买入1000万,在25年7月3日卖出500万,在25年7月8日卖出500万,那么在25年7月1日至25年7月31日的统计区间内,债券A持仓了1000万2天,持仓了500万5天。需要注意的是,有的债券可能在统计区间之前就已经持仓,比如债券B在25年6月28日买入200万,至25年7月31日仍未卖出,那么在25年7月1日至25年7月31日的统计区间内,债券B持仓200万30天。提供一个excel的VBA解决方案。结果的数据我希望分成多列在‘统计’表中对应的债券名称后输出,比如债券A持仓1000万2天,持仓500万5天,那么输出为4列,分别为10000000,2,5000000,5。
最新发布
07-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值