Sobes.tech
Middle

/* Kinā ir viena rinda ar vietām. Jaunais skatītājs izvēlas vietu, lai sēdētu pēc iespējas tālāk no citiem skatītājiem rindā. Tas ir, attālums no vietas, kur viņš sēdīs, līdz tuvākajam skatītājam, ir jābūt maksimālam. Ir garantēts, ka vienmēr ir brīvas vietas un ka jau ir sēdējis vismaz viens skatītājs. Uzrakstiet funkciju, kas, pamatojoties uz dotu vietu rindu (nulles un vienu masīvu), atgriezīs attālumu no izvēlētās vietas. Ievade: [1, 0, 0, 0, 0, 1] Izvade: 2 Ievade: [1, 0, 1, 0, 0, 1, 0, 0, 0, 1] Izvade: 2 Ievade: [1, 0, 1, 0] Izvade: 1 */

sobes.tech AI

Atbilde no AI

Funkcija ir jāatrod vieta (nulle ar indeksu), kur attālums līdz tuvākajai aizņemtajai vietai (viens) ir maksimāls.

Risinājuma ideja:

  • Pārlūkot masīvu, katrai brīvai vietai aprēķināt attālumu līdz tuvākajai aizņemtajai vietai.
  • Atgriezt šo maksimālo attālumu.

Optimizētais veids — viens pārejs ar aprēķinu attālumiem līdz tuvākajām vienībām pa kreisi un pa labi.

Piemērs Go valodā:

func maxDistance(biļetes []int) int {
    n := len(biļetes)
    kreisDist := make([]int, n)
    labDist := make([]int, n)

    // Aizpildīt attālumus līdz tuvākajai aizņemtajai vietai pa kreisi
    dist := n
    for i := 0; i < n; i++ {
        if biļetes[i] == 1 {
            dist = 0
        } else {
            dist++
        }
        kreisDist[i] = dist
    }

    // Aizpildīt attālumus līdz tuvākajai aizņemtajai vietai pa labi
    dist = n
    for i := n - 1; i >= 0; i-- {
        if biļetes[i] == 1 {
            dist = 0
        } else {
            dist++
        }
        labDist[i] = dist
    }

    maxDist := 0
    for i := 0; i < n; i++ {
        if biļetes[i] == 0 {
            // Minimālais attālums līdz tuvākajam skatītājam
            d := kreisDist[i]
            if labDist[i] < d {
                d = labDist[i]
            }
            if d > maxDist {
                maxDist = d
            }
        }
    }

    return maxDist
}

Tādējādi funkcija atgriezīs maksimālo attālumu līdz tuvākajam skatītājam izvēlētajā vietā.