Poznajemy coś takiego jak szybki wskaźnik. Wykonujemy ćwiczenia, zdobywając wiedzę o bardzo użytecznym podejściu. Do dzieła.

Ok, mamy takie stringi:

let string1 = ["a", "n", "n", "a", "\0"];

let string2 = ["k", "a", "j", "a", "k", "\0"];

Teraz opis zadania:

  • Znak „\0” jest znakiem oznaczającym koniec i nie liczy się do ilości znaków
  • Zadanie polega na tym, aby sprawdzić, czy ilość znaków jest parzysta czy nie
  • Nie wolno odwoływać się do length ani w żaden sposób zliczać czegokolwiek
  • Wolno jedynie:
    • Poruszać się do przodu o 2
    • Sprawdzać co pod wskaźnikiem
    • Sprawdzać co w elemencie o 1 większym niż wskaźnik

Ok, robimy to tak:

let string1 = ["a", "n", "n", "a", "\0"];

let string2 = ["k", "a", "j", "a", "k", "\0"];


function cStyleStringEvenLength(string){

    let fast = 0;

    while(string[fast] !== "\0" && string[fast+1] !== "\0"){
        fast += 2;
    }

    return string[fast] === "\0";
}


console.log(cStyleStringEvenLength(string1));
//true
console.log(cStyleStringEvenLength(string2));
//false

Mamy szybki wskaźnik, który skacze o 2 oraz warunek, że pod tym wskaźnikiem albo o 1 większym nie może być znaku kończącego.

Jeżeli po przejściu pętli fast wskazuje na znak kończący to ilość liter jest parzysta, jeżeli nie, to wskazuje na ostatnią literę a długość jest nieparzysta.

Możemy napisać analogicznie funkcję przeciwną:

function cStyleStringOddLength(string){

    let fast = 0;

    while(string[fast] !== "\0" && string[fast+1] !== "\0"){
        fast += 2;
    }

    return string[fast] !== "\0";
}

console.log(cStyleStringOddLength(string1));
//false
console.log(cStyleStringOddLength(string2));
//true

W tym ćwiczeniu chodzi o to, aby poznać koncepcję szybkiego wskaźnika, który:

  • zaczyna z jednego strony jakiejś uszeregowanej kolekcji (niekoniecznie indeksowanej)
  • skacze o 2 elementy w drugą stronę
  • robi to tak długo jak on sam lub element następny nie wskazuje na koniec uszeregowanej kolekcji