Array elementos repetidos

Iniciado por LGG, 5 Mayo 2015, 16:44 PM

0 Miembros y 1 Visitante están viendo este tema.

LGG

¿¿¿Como se hace para que un array formado a partir de otros, y ordenado de forma creciente, no tenga ningún valor repetido???

El ejercicio es el siguiente:

"Escribir un programa al que se le dé como entrada dos arrays de enteros
ordenados de forma creciente, y devuelva como salida un array ordenado de
forma creciente formado por los elementos de las entradas y sin incluir los elementos repetidos."


Éste es el código que tengo hasta ahora, pero se me repiten los valores:


#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main()
{
int V1[100],V2[100],V3[200];
int n1,n2,n3,i,j,k,l;

cout<<"Ingrese la dimension del vector 1: "<<endl;
cin>>n1;
cout<<endl;
cout<<"Ingrese los elementos del vector 1: "<<endl;
for(i=0;i<n1;i++){
cin>>V1[i];
}

cout<<endl;
cout<<"Ingrese la dimension del vector 2: ";
cin>>n2;
cout<<endl; 
cout<<"Ingrese los elementos del vector 2: "<<endl;
for(i=0;i<n2;i++){
    cin>>V2[i];
}

j=0;//indice para el primer vector
k=0;//indice para el segundo vector
l=0;//indice para el tercer vector

while ((j<n1)&&(k<n2)){
      if(V1[j]<V2[k]){
           V3[l]=V1[j];     
           j++;
      }
      else{
           V3[l]=V2[k];
           k++;
      }
           l++;

 
for(i=j;i<n1;i++){
       V3[l]=V1[i];
       l++;
}

for(i=k;i<n2;i++){
       V3[l]=V2[i];
       l++;
}

n3=l;// tamaño del vector tres
cout<<endl;
cout<<"El Vector 3 es: "<<endl;
cout<<endl;
for(i=0;i<n3;i++){
     cout<<"|"<<V3[i];
}
cout<<"|"<<endl;

cout<<endl;
system("pause"); 
return 0;
}



Si saben cómo, me haríais un gran favor! Gracias

LGG

eferion

#1
Tienes varias opciones. La primera se vale únicamente de tu código, el resto (lo he pensado mejor y solo pongo dos formas: la primera que será la que tengas que aplicar ahora y la segunda es más para que veas que no es necesario reinventar la rueda) usan funcionalidades de la STL

1. Paso a paso: Como los vectores originales están ordenados, puedes rellenar el vector final con el siguiente algoritmo:

 1. Partes de dos vectores iniciales, V1 y V2 y de un vector final V3.
 2. Inicializas los 'i' y 'j' a 0. 'i' iterará sobre el vector 'V1' y 'j' sobre el vector 'V2'
 3. Si el elemento V1[ i ] < V2[ j ]:
 3.1. añades V1[ i ] a V3
 3.2. incrementas 'i'
 3.3. Verificas que 'i' < n1:
 3.3.1. Si se cumple saltas al punto 3.
 3.3.2. Si no se cumple, añades todos los elementos que falten en V2 y sales
 4. En caso contrario, puede suceder que V1[ i ] == V2[ j ] o que V1[ i ] > V2[ j ]. A efectos prácticos las operaciones a realizar son las mismas. Básicamente repite los pasos comentados a partir de 3.1 pero para V2[ j ] y n2


2. usa el contenedor "set". Este contenedor tiene dos propiedades fundamentales:

* Sus elementos están siempre ordenados
* No admite duplicados

Después de almacenar todos los elementos en el set, vuelcas su contenido al vector resultado y... magia!!!

Código (cpp) [Seleccionar]

// Añadimos todos los elementos al contenedor "set"
std::set contenedorTemporal;
for( int i=0; i<n1; ++i )
 contenedorTemporal.insert( V1[ i ] );
for( int i=0; i<n2; ++i )
 contenedorTempora.insert( V2[ i ] );

// Ahora volcamos el contenido a V3
int* ptr = V3;
for( auto it = contenedorTempora.begin( ); it != contenedorTemporal.end( ); ++it, ++ptr )
 *ptr = *it;
n3 = contenedorTemporal.size( ); // Actualizamos n3 para indicar el número de elementos en V3
// En este punto, V3 tiene una lista de elementos ordenados y sin duplicados


Notas finales:

Acostúmbrate a usar nombres que signifiquen algo: n1, n2, n3, V1, V2, ... no dicen gran cosa y no ayudan demasiado en la lectura del código. No tengas miedo de usar nombres más largos... lo acabarás agradeciendo.