Middle
/* Místa v kině jsou uspořádána v jednom řádku. Divák, který právě přišel, si vybírá místo tak, aby seděl co nejdále od ostatních diváků v řadě. To znamená, že vzdálenost od místa, kam si sedne, k nejbližšímu divákovi, by měla být maximální. Je zaručeno, že vždy jsou volná místa a že již sedí alespoň jeden divák. Napište funkci, která na základě daného řady míst (pole nul a jedniček) vrátí vzdálenost od vybraného místa. Vstup: [1, 0, 0, 0, 0, 1] Výstup: 2 Vstup: [1, 0, 1, 0, 0, 1, 0, 0, 0, 1] Výstup: 2 Vstup: [1, 0, 1, 0] Výstup: 1 */
sobes.tech AI
Odpověď od AI
Funkce by měla najít místo (index s nulou), kde je vzdálenost k nejbližšímu obsazenému místu (s jedničkami) maximální.
Nápad řešení:
- Projít pole, u každého volného místa spočítat vzdálenost k nejbližšímu obsazenému.
- Vrátit tuto maximální vzdálenost.
Optimální způsob je jeden průchod s počítáním vzdáleností k nejbližším jedničkám vlevo a vpravo.
Příklad v Go:
func maxDistance(sedadla []int) int {
n := len(sedadla)
levaDist := make([]int, n)
pravaDist := make([]int, n)
// Vyplnit vzdálenosti k nejbližšímu obsazenému místu vlevo
dist := n
for i := 0; i < n; i++ {
if sedadla[i] == 1 {
dist = 0
} else {
dist++
}
levaDist[i] = dist
}
// Vyplnit vzdálenosti k nejbližšímu obsazenému místu vpravo
dist = n
for i := n - 1; i >= 0; i-- {
if sedadla[i] == 1 {
dist = 0
} else {
dist++
}
pravaDist[i] = dist
}
maxDist := 0
for i := 0; i < n; i++ {
if sedadla[i] == 0 {
// Minimální vzdálenost k nejbližšímu divákovi
d := levaDist[i]
if pravaDist[i] < d {
d = pravaDist[i]
}
if d > maxDist {
maxDist = d
}
}
}
return maxDist
}
Tímto způsobem funkce vrátí maximální vzdálenost k nejbližšímu divákovi pro zvolenou pozici.