Sobes.tech
Intern

""" Местата в киното са разположени в един ред. Един току-що пристигнал зрител избира място, за да седне възможно най-далече от останалите зрители в реда. Тоест, разстоянието от това място, до най-близкия зрител, трябва да бъде максимално. Гарантира се, че винаги има свободни места и вече има поне един зрител. Напишете функция, която по даден ред места (масив от нули и единици) ще върне разстоянието (броя на интервалите между седалките) от избраното място до най-близкия зрител. [1, 0, 0, 0, 1] -> 2 [1, 0, 1, 0, 0, 1, 0, 0, 1] -> 2 [1, 0, 1, 0] -> 1 """

sobes.tech AI

Отговор от AI

go package main

import ( "fmt" "math" )

func maxDistance(seats []int) int { maxDist := 0 lastOccupied := -1

for i, seat := range seats {
	if seat == 1 {
		if lastOccupied == -1 {
			// разстояние от началото на реда до първото заето място
			maxDist = i
		} else {
			// разстояние между две заети места
			midDist := (i - lastOccupied) / 2
			if midDist > maxDist {
				maxDist = midDist
			}
		}
		lastOccupied = i
	}
}
// разстояние от последното заето място до края на реда
tailDist := len(seats) - 1 - lastOccupied
if tailDist > maxDist {
	maxDist = tailDist
}
return maxDist

}

func main() { fmt.Println(maxDistance([]int{1, 0, 0, 0, 1})) // 2 fmt.Println(maxDistance([]int{1, 0, 1, 0, 0, 1, 0, 0, 1})) // 2 fmt.Println(maxDistance([]int{1, 0, 1, 0})) // 1 }


Обяснение:
- Обхождаме реда и запомняме индекса на последното заето място.
- За всяко заето място изчисляваме разстоянието до предишното и взимаме половината (най-отдалеченото място между тях).
- Вземаме предвид също разстоянията от началото на реда до първото заето място и от последното заето място до края на реда.
- Връщаме най-голямото от тези разстояния.