如何计算时间表中的“漏洞”

时间:2010-06-08 09:48:05

标签: java

我有一个这样的二维数组(它代表一个时间表):

alt text http://www.shrani.si/f/28/L6/37YvFye/timetable.png

橙色细胞是讲座,白色是空闲时间。我如何计算同一天讲座之间的免费小时数? (列是天,行是小时)

例如,在此表中,结果应为:
第一列为2 0表示第二列 - >该函数返回2(因为2 + 0 = 2)

4 个答案:

答案 0 :(得分:5)

schedule = ['11010100','01100000'] #original schedule
freehours = [day.strip('0').count('0') for day in schedule]

算法:转换为类似'11010100'的字符串,从开始和结束('110101')剥离0个字符并计算剩余的0个字符(2)。描述性地,第一个和最后一个填充期间之间的所有未填写的期间​​都是您的自由期间。

额外的极客: 更高效的是,如果使用布尔数组在C ++中工作:获取数组的迭代器,在初始化时通过任何0个val运行它。声明另一个并从任何0个值的末尾向后迭代。然后向前迭代启动迭代器,计算任何零,直到到达结束迭代器。

但是,如果你有一个很长的列表,那么只有向前迭代,存储最后1个的位置并在遇到下一个时将每个空间的大小添加到计数器可能更有效。这样的记忆在连续的块中读取,并且可以在流输入上执行求和,甚至将运行总计写入套接字。

答案 1 :(得分:0)

我不熟悉java。

只是说出这个概念,

1. Merge the two array as provide the result as a single.
2. Count the array values.

答案 2 :(得分:0)

像这样的东西

public int countHoles(boolean[][] timetable){
     int count=0;
     for (int days=0;days<timetable.length;days++){
          for (int i =1;i<timetable[days].length-1;i++){
              if (!timetable[days][i]){
                   int j=i-1; boolean before=false;
                   while(j>=0 || before) {if (timetable[days][j]) before=true; j--;}
                   j=i+1; boolean after=false;
                   while(j<timetables[days].length || after) {if (timetable[days][j]) after=true; j++;}
                   if (before && after) count++;
          }
     }

}

不知道第一个是否有效..但这是你可以做到的愚蠢方式。

答案 3 :(得分:0)

  1. 使用二维布尔数组(true如果有讲座,false如果有空......或类似的东西)
  2. 遍历数组
  3. 如果有自由元素,请检查当前(如果可用值)上方和下方的元素是否为true。如果是,请递增计数器
  4. 遍历后,计数器会显示结果。
  5. 尝试自己实施,如果您遇到任何问题,请告诉我们。