Remova as duplicatas da matriz e salve-as em outra [duplicata]
Recebi a tarefa de fazer um array sem valores duplicados de outro array existente. Então, eu fiz isso, mas quero saber se existe alguma outra maneira melhor de fazer isso.
Exemplo de entrada / saída
Input
: 1, 15, 1, 5, 1, 3
Output
: 1, 15, 5, 3
Meu código
#include <stdio.h>
int main(void) {
const int ARRAY_SIZE = 5;
int m[ARRAY_SIZE], p[ARRAY_SIZE];
for(int i = 0; i < ARRAY_SIZE; i++) {
printf("Enter number: ");
scanf("%d",&m[i]);
}
// k variable is used to be the new indexing of the array p;
int k = 0;
// if it has a duplication dup is changed to 1;
int dup = 0;
// Loops through the array.
for(int i =0; i < ARRAY_SIZE; i++) {
for(int j = i +1; j <ARRAY_SIZE ; j++) {
if(m[i] == m[j]) {
dup = 1;
break;
}
}
if(dup != 1) {
p[k++] = m[i];
}
dup = 0;
}
printf("The array without repeated values\n");
for(int i = 0; i < k; i++) {
printf("%d\n",p[i]);
}
return 0;
}
Eu quero algumas sugestões.
Desde já, obrigado. :)
Respostas
Se a entrada realmente tiver vírgulas entre os números, então vamos permitir isso aqui:
scanf("%d",&m[i]);
Em qualquer caso, é importante verificar o valor de retorno de scanf()
, caso contrário, poderíamos estar usando valores que não foram inicializados corretamente.
Provavelmente, vale a pena escrever funções separadas para entrada, saída e processamento e, em seguida, ter um sistema simples main()
que ligue os três.
Um sinalizador "dup" pode ser evitado reorganizando o loop interno. Aqui está uma versão compacta, de alguma forma um pouco de dentro para fora para que possamos fazer nossas coisas p[k++]=
na hora:
for (int i = 0; i < ARRAY_SIZE; i++) {
for (int j = i + 1; m[i] != m[j]; j++) { /*NO! m[i+1] will be illegal */
if (j == ARRAY_SIZE) {
p[k++] = m[i]; // copy this one, next "i" please
break;
}
}
}
Para maior clareza, quase prefiro isso como o loop interno:
for (int j = i + 1;; j++) {
if (j == ARRAY_SIZE) {
p[k++] = m[i]; // copy this one, next please
break;
}
if (m[i] == m[j])
break; // skip, next
}
Isso é mais simétrico; você pode comparar facilmente as duas condições de saída para este loop eterno (sem expressão do meio).
É importante primeiro verificar se j
atingiu ARRAY_SIZE e só depois usar em m[j]
.
Para uma matriz como 120000000...000012
eu acho que seria mais rápido pesquisar na nova e única matriz ... mas sim, é por isso que a classificação é uma primeira (e principal) etapa útil.
A primeira versão (compacta) está até errada . m[j]
já será ilegal para o último elemento.
for (int j = i + 1; m[i] != m[j];...