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