Sobes.tech
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.