Определить минимальный уникальный элемент массива - PullRequest
0 голосов
/ 27 октября 2019

Позвольте мне подчеркнуть тот факт, что я очень начинающий, факт, который, я уверен, очевиден в моем коде.

Мне нужно определить функцию, которая идентифицирует НИЗКОЕ УНИКАЛЬНОЕ (встречается только один раз) значение входного массива, однако мой нынешний подход имеет недостатки.

Я думаю, что изо всех сил пытаюсь интегрировать каждый аспект проблемы.

Я начинаю с сортировки значений входного массива от высшего к низшему через реализацию вложенного цикла. Затем я перехожу к установке всех значений, которые появляются более одного раза, в ноль. Наконец, я идентифицирую минимальное уникальное значение измененного массива и возвращаю его. Если в массиве нет уникального значения, я возвращаю -1.

Мне разрешили предположить, что каждый элемент входного массива будет как положительным, так и большим, чем ноль, а его длина будет не менее 1.

int minUnique(int *values, int length)

{

int i, j, temp, min = values[0];

for (i = 0; i < length; i++) {           /* sorting */
            for (j = 0; j < length - 1; j++) {
                if (values[j] < values[j +1]) {
                    temp = values[j + 1];
                    values[j + 1] = values[j];
                    values[j] = temp;               
                }
            }
        }

        for (i = 0; i < length; i++) {        
            printf(" %d", values[i]);
        }
        for (i = 0; i < length; i++) {          /* setting 0 */
            if (values[i] == values[i + 1]) {
                values[i] = 0;
                values[i + 1] = 0;
            }
        }
       for (i = 0; i < length; i++) {        
            printf("  %d", values[i]); 
    }
    for (i = 1; i < length - 1; i++) {          /* identifying min */
        if ((values[i] < min) && (values[i] != 0)) {
            min = values[i];
        } else {
            count++;
            } 
        } if (count == length) {
            return -1; 
    } else {
        return min;
    }
}

Если бы я был введенмассив, такой как значения [12] = {3, 7, 5, 6, 3, 4, 8, 4, 5, 8, 12, 11}, я ожидаю, что он будет реорганизован как значения [12] = {12, 11, 8, 8, 7, 6, 5, 5, 4, 4, 3, 3} и 6 подлежат возврату.

Мой код в настоящее время возвращает 3.

Код не генерирует никаких сообщений об ошибках.

примечание: вы можете игнорировать строки printf - они просто там, чтобы помочь мнепонять, что происходит

Ответы [ 2 ]

2 голосов
/ 27 октября 2019

В псевдокоде:

1. Sort from lowest to highest.
2. Iterate over the sorted array and return the first element whose neighbors are different.

Первый шаг можно выполнить, используя стандартную библиотечную функцию qsort().

0 голосов
/ 27 октября 2019

Ваш код для установки дублирующих элементов на ноль не работает, если элемент дублируется 3 раза (или любое нечетное число раз)

Также вы можете отсортировать массив по убыванию. Первым ненулевым элементом после удаления любых дубликатов будет ваш ответ.

Полный код приведен ниже.

#include <stdio.h>
int minUnique(int *values, int length)
{
  int i, j, temp;
  for (i = 0; i < length; i++) {           
    /* sorting */
    for (j = 0; j < length - 1; j++) {
      if (values[j] > values[j +1]) {
        temp = values[j + 1];
        values[j + 1] = values[j];
        values[j] = temp;               
      }
    }          
  }  
  for (i = 0; i < length; i++) {        
    printf(" %d", values[i]);
  }

  i=0;                              // Remove Duplicates
  while (i < length)
  {
    j=1;
    int dup = 0;
    while (values[i] == values[i+j])
    {
      values[i+j] = 0;
      dup = 1;
      j++;
    }
    if (dup == 1)
      values[i] = 0;
    i = i+j;  
  }
  printf ("\n"); 
  for (i = 0; i < length; i++) {        
    printf("  %d", values[i]); 
  }

  for (i = 0; i < length; i++) {          /* identifying min */
    if (values[i] != 0)
    {
      return (values[i]);
    }
  }
  return (-1); // no duplicates
}  

int main(void)
{
  int arr[] = {3, 7, 5, 6, 3, 3, 8, 4, 5, 8, 12, 11};
  int min = minUnique(arr, sizeof(arr)/sizeof(arr[0]));
  printf ("\nMinimum is %d\n",min);
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...