Найти сумму массива int - пропуская все числа от 6 до 7 включительно - PullRequest
0 голосов
/ 30 июня 2018

Я хотел бы написать программу, которая складывает все числа в массив целых чисел - за исключением! Поскольку число 6 не самое хорошее, я предлагаю исключить все разделы чисел, начиная с 6 и заканчивая 7 - включительно. Каждые 6 всегда будут сопровождаться 7 , но не обязательно наоборот.

Вот несколько примеров входных массивов и их ожидаемого вывода:

sum67([1, 2, 2, 6, 99, 99, 7]) = 5 Все цифры от 6 до 7 исключены.

sum67([1, 2, 2]) = 5 Нет 6 или 7 здесь.

sum67([1, 1, 6, 7, 2]) → 4 Ни 6, ни 7 не включены.

Все вышеуказанные тесты пройдены.

Еще раз, заголовок метода исправлен, и я могу только изменить тело метода. Вот моя попытка кода:

public int sum67(int[] nums) {
  int sum = 0;
  for (int i = 0; i < nums.length; i++) {
    // Adding all numbers that are not a 6
    if (nums[i] != 6) sum += nums[i];
  }
  for (int j = 0; j < nums.length; j++) {
    // check for the sixes - the lower bound exclusive
    if (nums[j] == 6) {
      for (int k = j + 1; k < nums.length; k++) {
        // check for the sevens - the upper bound inclusive
        if (nums[k] == 7) {
          // take away all the numbers between the 2 bounds, including the 7
          for (int m = j + 1; m <= k; m++) {
            sum -= nums[m];
          }
        }
      }
    }
  }
  return sum;
}

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

sum67([1, 6, 2, 6, 2, 7, 1, 6, 99, 99, 7]) = 2 Фактический вывод -463!

sum67([2, 2, 6, 7, 7]) = 11 Фактический вывод - -3.

Итак, по сути:

Где строка ошибки или строки в моем коде?

Есть ли лучший способ написания этой программы, который не имеет столько циклов и вложенных if с?

Ответы [ 2 ]

0 голосов
/ 30 июня 2018
public int sum67(int[] arr) {
    int sum = 0;
    boolean isIn67 = false;
    for (int i = 0 ; i < arr.length ; i++) {
        if (arr[i] == 6) {
            isIn67 = true;
            continue;
        } else if (arr[i] == 7 && isIn67) {
            isIn67 = false;
            continue;
        }
        if (!isIn67) {
            sum += arr[i];
        }
    }
    return sum;
}

Выше моя попытка. Объяснение:

  • Для прохождения всех элементов необходим только один цикл. В каждой итерации некоторые операторы if используются для определения того, должен ли этот элемент добавляться к сумме.
  • Существует переменная с именем isIn67, которая указывает, находится ли arr[i] в диапазоне 6-7, и поэтому не следует добавлять к сумме
  • Когда мы сталкиваемся с 6, мы устанавливаем isIn67 в true.
  • Когда мы сталкиваемся с 7 и isIn67 имеет значение true, мы устанавливаем isIn67 в false.
  • continue используется, чтобы мы не считали эти 7s
  • И, наконец, если мы не in67, мы добавляем элемент к сумме.

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

0 голосов
/ 30 июня 2018

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

  1. Итерируйте, пока не увидите 6
  2. Теперь повторяйте, пока не увидите первые 7, и вычтите все, что между ними, включая последние 7 (<= - это причина для -3 во втором примере)
  3. Теперь продолжайте и сделайте это снова для следующих 7 - вы дважды вычитаете все между первыми 6 и первыми 7!
  4. Перейдите к следующим 6 - и сделайте то же самое - вы снова вычтете вещи, которые вы вычитали ранее.

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

int sum = 0;
boolean noLikey = false;
for (int i = 0; i < nums.length; i++) {
    if (! noLikey && nums[i] == 6 ) noLikey = true;
    if ( noLikey ) {
        if ( nums[i] == 7 ) noLikey = false;
        continue;
    }
    sum += nums[i];
}

Это, конечно, предполагает, что за 6 всегда следует 7.

...