•night1
Strain
Karma: 0
Deconectat
Mesaje: 10
|
|
« : Decembrie 08, 2012, 18:34:03 » |
|
Cum se elimina elementele duplicat dintr-un vector de caractere? De exemplu, avem vectorul {b,a,n,a,n,a}. Cum ar trebui procedat ca sa ramana {b,a,n} ?
|
|
|
Memorat
|
|
|
|
•PlayLikeNeverB4
|
|
« Răspunde #1 : Decembrie 08, 2012, 18:44:02 » |
|
Cel mai simplu o faci construind un alt vector in care elementele sa fie unice. Faci asta parcurgand fiecare caracter din vectorul initial si verifici daca ai mai vizitat caracterul respectiv. Daca nu, il bagi in vectorul rezultat.
|
|
|
Memorat
|
|
|
|
•night1
Strain
Karma: 0
Deconectat
Mesaje: 10
|
|
« Răspunde #2 : Decembrie 08, 2012, 18:56:07 » |
|
Problema e putin mai complexa. Am 3 stringuri, "apple","banana" si "lemon", pe care le-am bagat in stringul M1. Trebuie sa extrag literele distincte(char-uri), astfel incat sa imi ramana : a,p,l,e,b,n,m,o.
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
|
« Răspunde #3 : Decembrie 08, 2012, 21:20:47 » |
|
Cea mai usoara varianta e cu headerul algorithm din C++, adica cu string din STL. Astfel, retii in stringul a stringul tau, il sortezi (cu functia sort din STL), si apoi folosesti unique (tot din STL), care iti pune literele "unice" (care apar o singura data) in prima parte a stringului, si apoi cu functia resize (a stringului) retii doar partea importanta. int main (void) { string a = "applebananalemon"; sort (a.begin (), a.end ()); // sortez a.resize (unique (a.begin (), a.end ()) - a.begin ()); // unique () returneaza un pointer (in cazul nostru iterator, asa se numeste) catre primul caracter care NU mai face parte din partea "unica" a stringului, si scazand din el un pointer catre inceputul stringului, returneaza numar de elemente pe care viitorul string o sa le aiba, ca sa putem lua doar partea "buna". cout << a; }
|
|
|
Memorat
|
|
|
|
•night1
Strain
Karma: 0
Deconectat
Mesaje: 10
|
|
« Răspunde #4 : Decembrie 08, 2012, 21:45:07 » |
|
Altfel nu se poate?
|
|
|
Memorat
|
|
|
|
•PlayLikeNeverB4
|
|
« Răspunde #5 : Decembrie 08, 2012, 21:48:35 » |
|
Cam la asa ceva ma gandeam. int k = 0; for(int i = 0; i < N; i++) { int gasit = 0; for(int j = 0; j < i; j++) if(vector_initial[i] == vector_initial[j]) gasit = 1; if(gasit == 0) { vector_rezultat[k] = vector_initial[i]; k++; } }
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
|
« Răspunde #6 : Decembrie 08, 2012, 22:22:07 » |
|
Cel mai simplu o faci construind un alt vector in care elementele sa fie unice. Faci asta parcurgand fiecare caracter din vectorul initial si verifici daca ai mai vizitat caracterul respectiv. Daca nu, il bagi in vectorul rezultat.
Ti-ai spus clar George aici, e cea mai usoara varianta. O schita ar fi : for (int i = 1; i <= N; ++i) viz[vector[i]] = 1; // viz e vector de vizitati, cu vector[i] = char for (char i = 'a'; i <= 'z'; ++i) if (viz[i]) afis i, ' ';
Acelasi lucru il poti face daca ai si cifre sau litere mari, faci la final alte foruri.
|
|
|
Memorat
|
|
|
|
•night1
Strain
Karma: 0
Deconectat
Mesaje: 10
|
|
« Răspunde #7 : Decembrie 08, 2012, 22:47:32 » |
|
Pare logic si ar fi tare frumos daca nu s-ar bloca (not responding)
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
|
« Răspunde #8 : Decembrie 08, 2012, 22:54:19 » |
|
Da-mi programul.
|
|
|
Memorat
|
|
|
|
•night1
Strain
Karma: 0
Deconectat
Mesaje: 10
|
|
« Răspunde #9 : Decembrie 08, 2012, 22:59:01 » |
|
Bun, in principiu merge, atata ca le si ordoneaza alfabetic si nu ar trebui.
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
|
« Răspunde #10 : Decembrie 08, 2012, 23:01:32 » |
|
Atunci fa asa : for (int i = 1; i <= N; ++i) if (viz[sir[i]] == 0) { // daca nu am dat pana acuma de caracter afis sir[i], ' '; viz[sir[i]] = 1; // il marcam vizitat, pentru a nu-l mai afisa; }
|
|
|
Memorat
|
|
|
|
•night1
Strain
Karma: 0
Deconectat
Mesaje: 10
|
|
« Răspunde #11 : Decembrie 08, 2012, 23:02:55 » |
|
Am folosit metoda cealalta, cea cu k, si a mers. Multumesc mult tuturor.
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
|
« Răspunde #12 : Decembrie 08, 2012, 23:05:51 » |
|
Ok, uite mai simplu decat atat : # include <cstdio> # include <cstring>
bool viz[130];
int main (void) { const char *s = "applebananalemon";
for (int i = 0, j = strlen (s); i < j; ++i) if (viz[s[i]] == 0) { printf ("%c", s[i]); viz[s[i]] = 1; } }
|
|
|
Memorat
|
|
|
|
•night1
Strain
Karma: 0
Deconectat
Mesaje: 10
|
|
« Răspunde #13 : Decembrie 08, 2012, 23:13:54 » |
|
Am sesizat pe unde s-au strecurat bug-urile cand am aplicat metoda asta. Bune amandoua. Multumesc
|
|
|
Memorat
|
|
|
|
|