Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Eliminare elemente duplicat  (Citit de 12399 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
night1
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« : 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
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« 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 Deconectat

Mesaje: 10



Vezi Profilul
« 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
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« 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.
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;
}
Memorat
night1
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #4 : Decembrie 08, 2012, 21:45:07 »

Altfel nu se poate?
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #5 : 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++;
  }
}
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« 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 :
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.
Memorat
night1
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« 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
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #8 : Decembrie 08, 2012, 22:54:19 »

Da-mi programul.
Memorat
night1
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« 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
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #10 : 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;
    }
Memorat
night1
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #11 : Decembrie 08, 2012, 23:02:55 »

Am folosit metoda cealalta, cea cu k, si a mers. Multumesc mult tuturor.
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #12 : 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;
        }
}
Memorat
night1
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« 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
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines