我有一个像这样的二维数组(它代表一个时间表):
替代文字http://www.shrani.si/f/28/L6/37YvFye/timetable.png
橙色细胞是讲座,白色是空闲时间.我如何计算同一天讲座之间的免费小时数?(列是天,行是小时)
例如,在此表中,结果应为:
2表示第二列
0表示第二列
- >函数返回2(因为2 + 0 = 2)
schedule = ['11010100','01100000'] #original schedule
freehours = [day.strip('0').count('0') for day in schedule]
Run Code Online (Sandbox Code Playgroud)
算法:转换为类似'11010100'的字符串,从开始和结束('110101')剥离0个字符并计算剩余的0个字符(2).描述性地,第一个和最后一个填充期间之间的所有未填写的期间都是您的免费期间.
额外的geekery: 更有效率,如果使用一个布尔数组在C++中工作:获取数组的迭代器,在初始化时通过任何0个val运行它.声明另一个并从任何0个值的末尾向后迭代.然后向前迭代启动迭代器,计算任何零,直到到达结束迭代器.
但是,如果你有一个很长的列表,那么只有向前迭代,存储最后1个的位置并在遇到下一个1时将每个空间的大小添加到计数器可能更有效.这样读入内存连续块和求和可以在流输入上执行,甚至可以将运行总计写入套接字.