Najduža serija
Funkcija analiziraj() učitava n celih brojeva u dinamički alociran niz. Prekida se pri unosu negativne vrednosti, u suprotnom ispisuje najdužu seriju jednakih susednih elemenata.
Zadaci:
- Pokrenuti testove pod ASan-om. Dva testa padaju iako je ispis tačan. Objasniti zašto.
- Ispraviti greške pomoću
std::make_unique<int[]>(n)iz<memory>. Pored toga, ključna rečdeletene sme da se pojavi u konačnom rešenju.
Ulaz
U prvom redu učitava se broj elemenata n n elemenata niza.
Izlaz
Ako je neki broj negativan, ispisati negativna vrednost na poziciji <p>, gde je p pozicija prve negativne vrednosti. Pozicije se računaju od 1.
U suprotnom ispisati najduži blok jednakih susednih vrednosti L.
Primer
Ulaz
8
3 3 1 1 1 2 2 3
Izlaz
3
Primer
Ulaz
4
5 -2 5 5
Izlaz
negativna vrednost na poziciji 2
Postavka
main.cpp
// Polazna (sirova) verzija - cilj je da se prepravi pomocu std::unique_ptr.
//
// 1. Pokrenuti testove pod ASan-om. Dva testa padaju iako je ispis tacan.
// Objasniti zasto (koji new[] nema odgovarajuci delete[]).
// 2. Prepraviti koristeci std::make_unique<int[]>(n) iz <memory>. Kada se
// zavrsi, rec "delete" ne sme da se pojavi u konačnom rešenju.
#include <iostream>
namespace matf
{
void analiziraj()
{
int n;
std::cin >> n;
int* a = new int[n];
for (int i = 0; i < n; ++i) {
std::cin >> a[i];
if (a[i] < 0) {
std::cout << "negativna vrednost na poziciji " << i + 1 << std::endl;
return; // TODO: curi blok a
}
}
int najbolja = 1;
int trenutna = 1;
for (int i = 1; i < n; ++i) {
if (a[i] == a[i - 1])
++trenutna;
else
trenutna = 1;
if (trenutna > najbolja)
najbolja = trenutna;
}
std::cout << najbolja << std::endl;
delete[] a;
}
} // namespace matf
int main()
{
matf::analiziraj();
return 0;
}
Rešenje
main.cpp
#include <iostream>
#include <memory>
namespace matf
{
void analiziraj()
{
int n;
std::cin >> n;
std::unique_ptr<int[]> a = std::make_unique<int[]>(n);
for (int i = 0; i < n; ++i) {
std::cin >> a[i];
if (a[i] < 0) {
std::cout << "negativna vrednost na poziciji " << i + 1 << std::endl;
return; // a oslobadja blok ovde
}
}
int najbolja = 1;
int trenutna = 1;
for (int i = 1; i < n; ++i) {
if (a[i] == a[i - 1])
++trenutna;
else
trenutna = 1;
if (trenutna > najbolja)
najbolja = trenutna;
}
std::cout << najbolja << std::endl;
} // ... i ovde
} // namespace matf
int main()
{
matf::analiziraj();
return 0;
}