Подсчет количества общих элементов в целочисленных массивах, расположенных в разных позициях - PullRequest
0 голосов
/ 12 марта 2019

Для моего задания мне нужно написать метод, который возвращает количество коров (см. Определение ниже), найденное между 2 массивами. Если входные массивы имеют разное количество элементов, метод должен вызвать исключение IllegalArgumentException с соответствующим сообщением.

Бык - это обычное число в массивах типа int, найденных в той же позиции, в то время как корова - это обычное число в массивах типа int, найденных в разных местах. Обратите внимание: если число уже является быком, его нельзя считать коровой.

Например, с учетом следующих массивов:

int[] secret = {2, 0, 6, 9};
int[] guessOne = {9, 5, 6, 2};
int[] guessTwo = {2, 0, 6, 2};
int[] guessThree = {1, 2, 3, 4, 5, 6};
int[] guessFour = {1, 3, 4, 4, 0, 5};

1) getNumOfCows(secret, guessOne) returns 2
2) getNumOfCows(secret, guessTwo) returns 0
3) getNumOfCows(secret, guessThree) returns an exception
4) getNumOfCows(guessThree, guessFour) returns 2

Мой метод, показанный ниже, отлично работает для примеров 1 и 3, но есть проблема с примерами 2 и 4, такая, что getNumOfCows (secret, guessTwo) возвращает 1 вместо 0, потому что элемент в secret [0] и guessTwo [3 ] считается коровой. Кто-нибудь может помочь мне исправить мой код?

// A method that gets the number of cows in a guess --- TO BE FIXED

  public static int getNumOfCows(int[] secretNumber, int[] guessedNumber) {

    // Initialize and declare a variable that acts as a counter

    int numberOfCows = 0;

    // Initialize and declare an array

    int[] verified = new int[secretNumber.length];

    if (guessedNumber.length == secretNumber.length) {

      // Loop through all the elements of both arrays to see if there is any matching digit

      for (int i = 0; i < guessedNumber.length; i++) {

        // Check if the digits represent a bull

        if (guessedNumber[i] == secretNumber[i]) {

          verified[i] = 1;
        }
      }

      for (int i = 0; i < guessedNumber.length; i++) {

        // Continue to the next iteration if the digits represent a bull

        if (verified[i] == 1) {

          continue;
        }

        else {

          for (int j = 0; j < secretNumber.length; j++) {

            if (guessedNumber[i] == secretNumber[j] && i != j) {

              // Update the variable

              numberOfCows++;

              verified[i] = 1;

            }
          }
        }
      }
    }

    else {

      // Throw an IllegalArgumentException

      throw new IllegalArgumentException ("Both array must contain the same number of elements");
    }

    return numberOfCows;
  }

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Проблема в том, что элемент, который находится несколько раз хотя бы в одном массиве, не будет обрабатываться правильно.

Возможная идея решения может быть такой:

  1. Создать список коров.
  2. Выполните итерацию по обоим массивам и добавьте каждый элемент , который находится в обоих массивах и еще не был добавлен. (примечание: сложность n²)
  3. Теперь, когда все возможных коров находятся в списке, выполните итерацию позиций массива с одинаковым индексом, и, если вы нашли быка, удалите число из списка коров.
  4. Теперь список коров содержит только коров.

Это решение может быть немного медленнее, чем текущее, но я думаю, что оно работает правильно.

0 голосов
/ 12 марта 2019

Сначала пройдитесь и отметьте всех быков, используя отдельный массив, чтобы убедиться, что позиция, которая является быком, также считается коровой

public static int getNumOfCows(int[] secretNumber, int[] guessedNumber) {
    int max = secretNumber.length;
    int cows = 0;
    int[] checked = new int[max];
    for (int i = 0; i < max; i++) {
        if (secretNumber[i] == guessedNumber[i]) {
          checked[i] = 1;
        }
    }

    for (int i = 0; i < max; i++) {
      if (checked[i] == 1) {
        continue;
      }
      for (int j = 0; j < max; j++) {
        if (secretNumber[i] == guessedNumber[j]) {
          cows++;
          checked[i] = 1;
        }
      }
    }
    return cows;
}

Теперь, когда этот ответ принят, оригинальный вопрос может быть признан закрытым как дубликат

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

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