Java Codingbat notAlone - почему это не работает для этого конкретного примера - PullRequest
0 голосов
/ 24 ноября 2018

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

notAlone ([1, 2, 3], 2) → [1, 3, 3]

notAlone ([1, 2, 3, 2, 5, 2], 2) → [1, 3, 3, 5, 5, 2]

notAlone ([3, 4], 3) → [3, 4]

public int[] notAlone(int[] nums, int val) {
  for(int k = 1 ; k<nums.length; k++)
  {
    if(k!= nums.length-1)
    {
      int max = nums[k];
      if(nums[k-1]>nums[k])
        max = nums[k-1];
      else if(nums[k+1] > nums[k])
        max = nums[k+1];
      if(nums[k-1] != nums[k] && nums[k] != nums[k+1])
        nums[k] = max;
    }
  }
  return nums;
}

Когда я запускал это на codingbat, это работало для всех примеров, кроме этого: notAlone ([1, 2, 3, 2, 5, 2], 2) должен вернуть [1, 3, 3, 5, 5, 2], но вместо него вернулось [1, 3, 3, 3, 5, 2].

Я действительно застрял в том, как решить эту проблему, потому что, на мой взгляд, то, что я написал, должно работать и для этого конкретного примера, но, очевидно, это не так.Откуда моя ошибка?Как мне переписать мой код?Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 24 ноября 2018

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

public static int[] notAlone(int[] nums, int val) {
    for(int k = 1 ; k<nums.length - 1; k++)
    {
        if(nums[k]==val && nums[k-1] != nums[k] && nums[k] != nums[k+1])
            nums[k] = Math.max (nums[k-1], nums[k+1]);
    }
    return nums;
}

Кстати, в вашем решении вы игнорируете данное значение (val):

Возвращает версию данного массива, в которой заменяется каждый экземпляр данного значения , который является единственным ...

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

Когда k==3:

int max = nums[k]; // max = 2
if(nums[k-1]>nums[k]) // 3 > 2
    max = nums[k-1]; // max = 3
else if(nums[k+1] > nums[k]) // no evaluated. therefore you change num[3] to 3 instead of to 5
    max = nums[k+1];

Если бы вы заменили эти 5 строк на:

int max = nums[k-1];
if(nums[k+1] > max)
    max = nums[k+1];

, вы бы получилиполучил правильный вывод.

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