Поиск свободного места в кинотеатре

Представим, что у нас есть кинотеатр с одним рядом. Вы пришли посмотреть кино и хотите находиться максимально далеко от других людей.

Условие: в ряду сидит как минимум один зритель.

Чтобы эту задачу рассматривать в качестве задачи на алгоритмы по программированию, надо житейский вид перенести в более привычный... Итак, ряд у нас - это intArray, состоящий из нулей и единиц, где нуль - это свободное место, а единица - занятое.

Сигнатура

fun findDistance(array: IntArray): Int 

Тесты

@Test  
fun makeTest() {  
    Assert.assertEquals(2, findDistance(intArrayOf(1, 0, 0, 0, 1, 1)))  
    Assert.assertEquals(2, findDistance(intArrayOf(1, 0, 0, 0, 0, 1, 0)))  
    Assert.assertEquals(3, findDistance(intArrayOf(1, 0, 0, 0, 0, 0, 0, 1, 0)))  
    Assert.assertEquals(1, findDistance(intArrayOf(1, 0, 1, 0)))  
    Assert.assertEquals(2, findDistance(intArrayOf(0, 0, 1, 0)))  
    Assert.assertEquals(3, findDistance(intArrayOf(1, 0, 0, 0)))  
    Assert.assertEquals(3, findDistance(intArrayOf(0, 0, 0, 1, 0)))  
}

Решение

fun findDistance(array: IntArray): Int {  
    var maxDistance = 0  
    var prevOne = -1  
  
    for (i in array.indices) {  
        val number = array[i]  
  
        if (number == 1) {  
            if (prevOne == -1) {  
                maxDistance = i  
            } else {  
                maxDistance = maxOf(maxDistance, (i - prevOne) / 2)  
            }  
  
            prevOne = i  
        }  
    }  
  
    if (prevOne != -1) 
        maxDistance = maxOf(maxDistance, array.size - 1 - prevOne)  
    
  
    return maxDistance  
}
  • Первый проход по массиву: Мы ищем единицы и для каждого нуля, находящегося между двумя единицами, вычисляем расстояние до ближайшей единицы.
  • Начальные и конечные нули: Для крайних нулей (в начале массива до первой единицы и в конце массива после последней единицы) вычисляется расстояние до ближайшей единицы.

upd. Увы, но эту задачку на собесе я не решил. Точнее решил, но не так как в итоге здесь.