Informatică, întrebare adresată de drcompress, 8 ani în urmă

Căutare într-un șir aproape sortat - Problema C++

Bogdan a învățat programare de pe WellCode și a aplicat pentru un job la o companie mare de IT. La interviul tehnic, a primit următoarea problemă:

Se dă un şir de n numere naturale care are o proprietate mai specială. Iniţial, el a fost sortat crescător, dar i s-au aplicat un număr necunoscut de permutari circulare spre stânga. Se mai dau k valori întregi. Află care dintre cele k valori apar în primul șir.

Bogdan s-a descurcat la interviu şi a fost angajat! Acum este rândul tău să rezolvi problema.

Date de intrare
Programul citeşte de pe prima linie un număr natural n, iar de pe urmatoarea linie un şir format din n numere naturale, având proprietățile din enunț. Pe cea de-a 3-a linie se citeşte un număr natural k, iar pe urmatoarea linie k valori întregi, reprezentând numerele pe care trebuie să le cauți în șir.

Date de ieşire
Programul afişează pe ecran, pentru fiecare din cele k valori, daca se găsește sau nu în şirul dat. Daca x se găseşte în şir se va afişa mesajul "x se gaseste in sir". In caz contrar, se va afisa mesajul "x nu se gaseste in sir". (Unde în loc de x vei afișa numărul întreg căutat)

Aceasta este o PROBLEMĂ DE INTERVIU cu care e posibil să te întâlnești atunci când aplici pentru joburi de programator!

Restricţii şi precizări
0 < n ≤ 50 000
numerele din ambele șiruri au valori în intervalul (0, 1 000 000 000]
0 < k ≤ 10 000
Exemplu
Date de intrare
7
5 12 15 17 20 2 4
4
1 15 5 7

Date de ieșire
1 nu se gaseste in sir
15 se gaseste in sir
5 se gaseste in sir
7 nu se gaseste in sir

Răspunsuri la întrebare

Răspuns de CaptnBanana
3

Răspuns:

Cum n e asa de mic cred ca se poate si asa, in O(N + K)

Explicație:

#include <bits/stdc++.h>

using namespace std;

const int N = 5e4;

int n, a[N], k, num;

unordered_map<int, bool> m;

int main(){

   cin >> n;

   for(int i = 0; i < n; i++){

       cin >> a[i];

       m[a[i]] = 1;

   }

   cin >> k;

   while(k--){

       cin >> num;

       cout << num << " nu se gaseste in sir\n" + m[num] * 3;

   }

}


drcompress: Multumesc frumos dar nu am invatat inca bool si altele.
drcompress: Eu m-am apucat sa lucrez si ar trebui sa arate cam asa:
drcompress: #include
using namespace std;
int main(){
int n, gasit, m;
cin >> n;
int v[50000];
int w[10000];
for(int i = 0; i < n; i++){
cin >> v[i];
}
cin >> m;
for(int i = 0; i < m; i++){
cin >> w[i];
}
gasit = 0;
for(int i = 0; i < m; i++){
if(w[i] == v[i]){
gasit = 1;
}
if(gasit == 1){
cout << w[i] << " se gaseste in sir" << '\n';
}
else
cout << w[i] << " nu se gaseste in sir" << '\n';
}

return 0;
}
drcompress: imi zice ca niciunul nu se afla in primul sir :)
drcompress: ceva gresesc dar inca nu m-am prins ce
CaptnBanana: #include

using namespace std;

const int N = 50000;
int n, a[N], k, num;

int main(){
cin >> n;
for(int i = 0; i < n; i++)
cin >> a[i];

cin >> k;
while(k--){
cin >> num;
for(int i = 0; i < n; i++){
if(num == a[i]){
cout << num << " se gaseste in sir\n";
num = -1;
break;
}
}

if(num != -1)
cout << num << " nu se gaseste in sir\n";
}
}
CaptnBanana: poti sa faci si asa dar e mai ineficient; daca stii cautare binara si sortarea unui sir at. ti-as recomanda sa aduci sirul initial la faza anterioara in care era sortat si sa aplici cautarea binara pt. fiecare dintre cele k numere pe care le cauti dupa, altfel e ok si asa
drcompress: Multumesc mult de tot
drcompress: O verification acum pe platforma sa vad ce spune
drcompress: 88 de puncte! totul ok doar ca-mi da "limita de timp depasita :)
Alte întrebări interesante