Найти элементы с заданной разницей в массиве - PullRequest
0 голосов
/ 18 мая 2019

1.Резюме

1.1.Язык: C

У меня есть такой массив {30, 220, 219, 220, 221}, и у меня есть разностное значение, допустим 9 (k = 9).Я хочу получить все целочисленные элементы массива, которые имеют меньшую разницу.Затем верните среднее значение этих допустимых значений.

Примечание 1. размер массива не фиксирован.например, это может быть так:

{220, 219, 220, 30, 216, 224, 217} // больший размер массива

или {222, 220, 219, 220, 221} // все значения находятся в пределах разницы

или {30, 66, 89, 220, 221} // другие значения выходят за пределы диапазона

Примечание 2. дублирующиеся элементы не должны бытьудален.Иначе, это может повлиять на усреднение.

1.2.Пример:

Заданный массив: {30, 219, 220, 221, 216, 220};

Разница = 9;Я ищу среднее значение 219 220 221 216 220, возвращаемое в целых числах, равное 219.

Что я делаю, так это сначала нахожу индексы подходящих элементов.Затем удаляем дубликаты индексов, затем усредняем.

2.Справочная информация

Я написал следующий код с помощью примеров, которые я нашел на разных страницах, но есть некоторые проблемы с ним.

3.Код

#include <stdio.h> 
#include <math.h>



int countPairs(int a[], int n, int k)
{
  printf( "n is %d \tand\t", n); //debug
  printf( "k is %d\n\n", k); //debug
//////////////////////////////////////// finding indexes ////////////////
//credit: https://www.geeksforgeeks.org/pairs-difference-less-k/
  int index[n*2];
    int res = 0;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {

            if ((a[j] - a[i]) < k) {
                index[res] = j;
                printf("index[%d]= %d,\t", res, index[res]); //debug
                printf("(%d,%d), (%d,%d)\n", i, j, a[i], a[j]); //debug
                res++;
            }
        }
    }
///////////////////////////////////////// removing duplicate indexes //////
// credit: https://www.studytonight.com/c/programs/array/remove-duplicate-element-program
  int i, j, t, m=n*2;
    for (i = 0; i < m; i++)
    {
        for (j = i + 1; j < m; )
        {
            if (index[j] == index[i])
            {
                for (t = j; t < m; t++)
                {
                    index[t] = index[t + 1];
                }
                m--;
            }
            else
            {
                j++;
            }
        }
    }

//////////////////////////////////////////////averaging ///////////
  int arr[6],avg=0;
  for (int i = 0; i <4; i++ ) {
      arr[i]=a[index[i]];
      avg+=arr[i];

      printf( "a[%d] : %d\n", i, arr[i]); //debug

  }    
  avg/=4;
  printf( "Average : %d\n", avg); //debug
////////////////////////////////////////////////////////////////
    return avg;
}



int main()
{
    int a[] = {30, 219, 220, 221, 216, 220};
    int k = 9;
    int n = sizeof(a) / sizeof(a[0]);
  /////////////////////////////////
    printf("\nGiven array: {");
    for (int i = 0; i <n; i++ ) {
      printf("%d", a[i]);
      if(i<n-1){
        printf(", ");
      }
    }
    printf("}\n\n");
  /////////////////////////////////
  countPairs(a, n, k);
   ///////////////////////////////

    return 0;
}

4.Фактические результаты, включая сообщения об ошибках

С этим кодом связаны две проблемы:

  1. пропущен первый действительный индекс.В моем коде выходные данные пропускают индекс 1 данного массива, который является элементом 219. Как я могу это исправить?В настоящее время он основан на переменной J.

  2. Я не могу сделать код универсальным и гибким в отношении размеров массива или номеров циклов.

Например, если вы посмотрите на:

строка 50 и 57-число 4 в :: для (int i = 0; i <4; i ++) </em> и avg / = 4;

строка 47-номер 6 в :: обр [6]

строка 24 переменная m- in :: m = n * 2;// это значение не логично, я просто сделал это на основе простого предположения

строка 9-размер массива в :: index [n * 2];// этот размер массива не логичен, я просто сделал это на основе простого предположения

Копия моего кода с нумерацией строк может быть найдена по адресу: https://repl.it/repls/SuburbanRelevantDisassembly

Заглядывая впередиметь вашу помощь / предложения.Или вы предлагаете лучшее решение по сравнению с этим?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 18 мая 2019

Итак, пару вещей, которые я заметил:

  1. Вы должны смотреть на абсолютное значение разницы, иначе порядок чисел в вашем вводе имеет значение, и вы будете включатьзначения, которые не должны быть включены.Например, 30 - 200 = -170, а -170 меньше 7. Просто измените (a[j] - a[i]) на abs(a[j] - a[i]).

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

Изменить

index[res] = j;
res++;

на

index[res] = j;
res++;
index[res] = i;
res++;

При проверке дубликатов вы сравниваете индексы из входного массива (заполняемого во время проверок различий) вместо фактических чисел.Это вызовет проблемы, если один и тот же номер будет введен в ваш ввод дважды.Вместо index[j] == index[i], сделайте a[index[j]] == a[index[i]], так как index - это массив индексов для a

Что касается длин с жестким кодом и тому подобного, вы должны использоватьразмер исходного входного массива.Изучите динамическое распределение памяти (malloc и free), чтобы создать массивы определенной продолжительности выполнения.

Возможно, это еще не все, но, надеюсь, поможет вам начать работу.

0 голосов
/ 18 мая 2019

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

int countPairs(int a[], int n, int k)
{
  printf( "n is %d \tand\t", n);
  printf( "k is %d\n\n", k);
  int index[n*2];
  int res = 0;

  for (int i=0; i<n; i++){
    for(int j=i+1; j<n; j++){
      if((a[j] - a[i]) < k){
        index[res] = a[i];
        res++;
      }
    }
  }

  int aux = 0;
  for(int i=0; i<res; i++)
    aux = aux + index[i];

  printf("Average: %d", aux/res);
  return aux/res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...