În acest articol voi prezenta câteva probleme elementare cu vectori în C++, ce presupun prelucrarea elementelor unui vector, verificarea unor proprietăți, parcurgerea unui vector, etc. Problemele sunt simple, însă fiecare are o idee bună de reținut. Pentru toate acestea vom considera un vector v[VMAX], de tip int, indexat de la 0, cu numărul de elemente n.

Probleme de parcurgere a unui vector

Problema 1.

Să se determine numărul de elemente impare din vector.

Se parcurge vectorul și dacă elementul curent este impar, soluția (pe care o reținem într-o variabilă nr) se incrementează.

Problema 2.

Să se determine numărul de elemente din vector care sunt multipli de k.

Aceeași idee ca mai sus, doar că la fiecare pas testăm dacă elementul curent este divizibil cu numărul k.

Problema 3.

Să se afișeze elementele vectorului de pe poziții pare, în ordinea crescătoare a indicilor.

Parcurgem vectorul din 2 în 2 pornind de la poziția 0. Nu are importanță dacă n este par sau impar.

Problema 4.

Să se afișeze elementele vectorului de pe poziții impare, în ordinea descrescătoare a indicilor.

Aici contează paritatea lui n, deoarece nu mai pornim de la o poziție constantă. Pentru a începe de la o poziție pară, vom folosi expresia compactă n % 2 ? n - 2 : n - 1. Operatorul ?: este mai puțin folosit la școală, așa că dacă nu îl cunoașteți, puteți consulta acest articol. Vom reține această valoare de la început într-o variabilă k, deoarece n-am vrea să se calculeze la fiecare pas.

Problema 5.

Să se determine minimul și maximul elementelor din vector, precum și indicii acestor valori.

Vom folosi două variabile ce vor reține indicii minimului și respectiv maximului din vector, iMin și iMax. Le inițializăm pe ambele cu 0, ceea ce înseamnă că inițial atât minimul cât și maximul sunt egale cu primul element din vector. Apoi parcurgem restul vectorului și actualizăm cele două valori. Nu este necesar să reținem încă două variabile pentru minim și maxim, deoarece avem deja aceste valori în vector și le putem accesa foarte simplu.

Problema 6.

Să se determine suma elementelor vectorului.

Pur și simplu parcurgem vectorul și adunăm într-o variabilă sum fiecare valoare din el. Trebuie să fim atenți însă la intervalul de valori ale elementelor vectorului, deoarece suma va putea depăși maximul pe care îl suportă tipul int, caz în care va trebui să folosim (unsigned) long long int. Sau în cel mai rău caz, numere mari, desigur 😀

Problema 7.

Să se afișeze elementele vectorului cuprinse între indicii a și b.

Modificăm un pic antetul for-ului de la afișarea unui vector. Pornim de la a și ne oprim la b.

Problema 8.

Să se afle câte elemente ale vectorului aparțin intervalului închis determinat de primul și ultimul element.

Parcurgem vectorul și la fiecare pas testăm dacă elementul curent respectă condiția dată. Dacă da, incrementăm soluția. Putem inițializa răspunsul cu 2 și sări peste primul și ultimul element, deoarece știm sigur că ele respectă condiția.

Problema 9.

Să se inverseze elementele vectorului dat.

Putem folosi un contor care „merge” până la jumătatea vectorului, dar ar trebui să găsim o formulă în funcție de acesta pentru a determina indicele elementului din dreapta cu care trebuie să-l interschimbăm... În plus, ar fi și ineficient să se calculeze acea expresie la fiecare pas, așa că cea mai bună variantă este următoarea: Folosim 2 iteratori, unul pentru stânga și unul pentru dreapta. La fiecare pas îl incrementăm pe cel stâng și îl decrementăm pe cel drept, apoi interschimbăm elementele corespunzătoare. Ne oprim când stânga depășește dreapta.

Probleme de ștergere și de inserare a unor elemente într-un vector

Problema 1.

Să se șteargă elementul din vector de pe poziția k.

Se mută fiecare element de după poziția k pe poziția precedentă, după care se actualizează valoarea lui n.

Problema 2.

Să se insereze elementul x imediat după poziția k - 1.

Se mută elementele de la n - 1 la k cu o poziție la dreapta, iar apoi se pune valoarea x pe poziția k și se actualizează n.

Problema 3.

Să se afișeze toate permutările circulare spre stânga ale vectorului.

Pentru șirul 1 2 3, permutările circulare spre stânga sunt cele de mai jos:

Observăm că numărul de permutări circulare spre stânga ale vectorului este egal cu numărul său de elemente, adică n în cazul nostru. În plus, prima permutare coincide cu șirul inițial. Pentru celelalte n - 1 permutări, mutăm elementele de pe pozițiile 1, 2, ..., n - 1 cu o poziție la stânga, iar pe primul îl ducem la final.

Probleme de verificare a unor proprietăți într-un vector

Problema 1.

Să se verifice dacă în vector există elemente impare.

Inițializăm o variabilă de tip bool numită ok cu false. Parcurgem vectorul iar dacă găsim un element impar, ok devine true și ne oprim (prin break).

Problema 2.

Să se verifice dacă toate elementele vectorului sunt egale.

Din nou, folosim o variabilă ok, dar de data asta o inițializăm cu true. Parcurgem vectorul iar dacă dăm de un element care e diferit de v[0], ok devine false și ne oprim prin break.

Problema 3.

Să se verifice dacă toate elementele vectorului sunt distincte două câte două.

Pentru fiecare element se testează dacă nu cumva este egal cu unul din dreapta lui. Dacă da, răspunsul devine NU. Dacă am ști că intervalul de valori ale elementelor din vector e relativ mic, am putea optimiza soluția prin folosirea unui vector de frecvență.

Problema 4.

Să se verifice dacă vectorul este ordonat crescător.

Pentru fiecare element, începând cu al doilea, testăm dacă este mai mic decât precedentul. Dacă da, răspunsul devine NU.

Problema 5.

Știind că elementele vectorului sunt distincte două câte două, să se verifice dacă vectorul dat reprezintă o permutare a mulțimii {1, 2, …, n}.

Se calculează minimul și maximul din vector. Dacă minimul e 1 și maximul e n, atunci răspunsul este DA.

Vă recomand să citiți și articolul despre vectori caracteristici și vectori de frecvență, pentru că aceștia sunt două aplicații foarte importante ale vectorilor. Dacă aveți vreo problemă cu vectori care vă dă bătăi de cap, scrieți un comentariu și vă voi ajuta 🙂

Îți place conținutul acestui site?

Dacă vrei să mă susții în întreținerea server-ului și în a scrie mai multe articole de calitate pe acest blog, mă poți ajuta printr-o mică donație. Află aici cum o poți face!