Как рассчитать «дыры» в расписании - PullRequest
1 голос
/ 08 июня 2010

У меня есть двумерный массив, подобный этому (он представляет расписание):

альтернативный текст http://www.shrani.si/f/28/L6/37YvFye/timetable.png

Оранжевые клетки - это лекции, а белые - свободное время. Как рассчитать количество свободных часов между лекциями в один и тот же день? (столбцы - дни, а строки - часы)

Например, в этой таблице результат должен быть:
2 для первого столбца
0 для второго столбца
-> Функция возвращает 2 (потому что 2 + 0 = 2)

Ответы [ 4 ]

5 голосов
/ 08 июня 2010
schedule = ['11010100','01100000'] #original schedule
freehours = [day.strip('0').count('0') for day in schedule]

Алгоритм: преобразовать в строку типа '11010100', убрать 0 символов из начала и конца ('110101') и сосчитать 0 символов (2), которые остались. Описательно, что все периоды между первым и последним заполненным периодом, которые не заполнены, являются вашими свободными периодами.

Дополнительные гикиры: Более эффективно, если вы работаете в C ++ с массивом логических значений: получите итератор для массива, запустите его через любые 0 значений в начале. Объявите другое и итерируйте в обратном направлении от конца по любым 0 значениям. Затем выполните итерацию начального итератора вперед, считая все нули до достижения конечного итератора.

Однако, если у вас был очень длинный список, может быть более эффективно выполнять итерацию вперед, сохраняя позицию последней 1 и добавляя размер каждого пробела к счетчику при встрече со следующим 1. Таким образом, память читается в смежных блоках, и суммирование может выполняться на потоковом входе, даже записывая текущие суммы в сокет.

0 голосов
/ 08 июня 2010

Примерно так

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++;
          }
     }

}

Не знаю, работает ли первый для работы ... но это глупый способ, которым вы можете это сделать.

0 голосов
/ 08 июня 2010
  1. Используйте двумерный логический массив (true, если есть лекция, и false, если свободна .. или что-то в этом роде)
  2. Обойти массив
  3. Если есть свободный элемент, проверьте, является ли элемент выше и ниже текущего (если доступно значение) true. Если да, увеличить счетчик
  4. После обхода счетчик выдает результат.

Попробуйте реализовать себя и дайте нам знать, если у вас возникнут какие-либо проблемы.

0 голосов
/ 08 июня 2010

Я не знаком с Java.

Просто расскажу об этом,

1. Merge the two array as provide the result as a single.
2. Count the array values.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...