infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: corina elena din Decembrie 08, 2012, 18:34:03



Titlul: Eliminare elemente duplicat
Scris de: corina elena din 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} ?


Titlul: Răspuns: Eliminare elemente duplicat
Scris de: George Marcus din 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.


Titlul: Răspuns: Eliminare elemente duplicat
Scris de: corina elena din 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.


Titlul: Răspuns: Eliminare elemente duplicat
Scris de: Simoiu Robert din 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.
Cod:
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;
}


Titlul: Răspuns: Eliminare elemente duplicat
Scris de: corina elena din Decembrie 08, 2012, 21:45:07
Altfel nu se poate?


Titlul: Răspuns: Eliminare elemente duplicat
Scris de: George Marcus din Decembrie 08, 2012, 21:48:35
Cam la asa ceva ma gandeam.
Cod:
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++;
  }
}


Titlul: Răspuns: Eliminare elemente duplicat
Scris de: Simoiu Robert din 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 :
Cod:
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.


Titlul: Răspuns: Eliminare elemente duplicat
Scris de: corina elena din Decembrie 08, 2012, 22:47:32
Pare logic si ar fi tare frumos daca nu s-ar bloca (not responding)


Titlul: Răspuns: Eliminare elemente duplicat
Scris de: Simoiu Robert din Decembrie 08, 2012, 22:54:19
Da-mi programul.


Titlul: Răspuns: Eliminare elemente duplicat
Scris de: corina elena din Decembrie 08, 2012, 22:59:01
Bun, in principiu merge, atata ca le si ordoneaza alfabetic si nu ar trebui.


Titlul: Răspuns: Eliminare elemente duplicat
Scris de: Simoiu Robert din Decembrie 08, 2012, 23:01:32
Atunci fa asa :
Cod:
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;
    }


Titlul: Răspuns: Eliminare elemente duplicat
Scris de: corina elena din Decembrie 08, 2012, 23:02:55
Am folosit metoda cealalta, cea cu k, si a mers. Multumesc mult tuturor.


Titlul: Răspuns: Eliminare elemente duplicat
Scris de: Simoiu Robert din Decembrie 08, 2012, 23:05:51
Ok, uite mai simplu decat atat :
Cod:
# 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;
        }
}


Titlul: Răspuns: Eliminare elemente duplicat
Scris de: corina elena din Decembrie 08, 2012, 23:13:54
Am sesizat pe unde s-au strecurat bug-urile cand am aplicat metoda asta. Bune amandoua. Multumesc