fix34 codingbat java - почему бы это не сработать? - PullRequest
0 голосов
/ 06 декабря 2018

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

Ниже мой код.

public int[] fix34(int[] nums) {
  for(int k = 0; k<nums.length; k++)
  {
    if(nums[k] == 3)
    {
      int jay = nums[k+1];
      for(int j = 0; j<nums.length; j++)
      {
        if(nums[j] == 4)
        {
          nums[k+1] = nums[j];
          nums[j] = jay;
        }
      }
    }
  }
  return nums;

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

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

В вашем коде есть логическая ошибка.Каждый раз, когда вы проверяете, имеет ли значение nums [k] == 3, вы запускаете внутренний цикл, который заменяет элемент сразу после 3 на first 4, который он находит в массиве.Если я проиллюстрирую это (хотя и очень плохо):

Мы просто продолжим цикл, если nums [k]! = 3, поскольку он ничего не делает.

Ваш пример массива = {1, 3,2,5,3,4,4}

когда k == 1, тогда nums [k] == 3 соответствует истине.

Таким образом, он запускает внутренний цикл, и массив меняется на это:

Меняет местами 2 с индексом 2 и 4 с индексом 5, поскольку первый элемент 4 находится с индексом 5

Массив после первого выполнения внутреннего цикла: {1,3,4,5, 3,2,4}

Тогда он ничего не делает, пока не доберется до k == 4

, когда доберется до k == 4, затем nums [k] == 3правда

Таким образом, он запускает внутренний цикл, и массив меняется на это:

Результирующий массив после второго выполнения внутреннего цикла: {1,3,2,5,3,4,4}

Как видите, он поменял первые 4 (в индексе 2) с 2 в индексе 5. Но первые 4 уже были правильно размещены (при первом выполнении внутреннего цикла) и не должны двигаться.Таким образом, вам нужно отслеживать последний элемент, который вы поместили правильно, и установить начало вашего внутреннего цикла после этого последнего элемента.Дайте мне знать, если это имеет смысл.

В данный момент ваша программа делает следующее: найдите первый элемент, равный 4, и поместите его после последнего элемента, равного 3 (и некоторые элементы в середине поменялись местами).

0 голосов
/ 06 декабря 2018

Я сохраняю вашу логику и делаю некоторые изменения.Внутренний цикл нуждается в break после того, как 4 найден и обмен сделан.Кроме того, при поиске 4, обход любых 4, следующих за 3:

public static int[] fix34(int[] nums) {
    for(int k = 0; k < nums.length; k++) {
        if(nums[k] == 3) {
            int jay = nums[k+1];
            if (jay != 4) {
                for (int j = 1; j < nums.length; j++) {
                    if (nums[j] == 4 && nums[j - 1] != 3) {
                        nums[k + 1] = 4;
                        nums[j] = jay;
                        break;
                    }
                }
            }
        }
    }
    return nums;
}

public static void main(String[] args) {
    int[] array1 = {1, 3, 1, 4};
    int[] array2 = {1, 3, 1, 4, 4, 3, 1};
    int[] array3 = {3, 2, 2, 4};

    System.out.println(Arrays.toString(array1) + "-->" + Arrays.toString(fix34(array1)));
    System.out.println(Arrays.toString(array2) + "-->" + Arrays.toString(fix34(array2)));
    System.out.println(Arrays.toString(array3) + "-->" + Arrays.toString(fix34(array3)));
}

, напечатает

[1, 3, 1, 4]-->[1, 3, 4, 1]
[1, 3, 1, 4, 4, 3, 1]-->[1, 3, 4, 1, 1, 3, 4]
[3, 2, 2, 4]-->[3, 4, 2, 2]
0 голосов
/ 06 декабря 2018

Вы перезапускаете j на 0 каждый раз, когда находите 3.Вместо этого вам нужно отследить, где был последний 4, с которым вы работали, и начать искать следующий после него:

public int[] fix34(int[] nums) {
    int last4 = 0;
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] == 3) {
            while (nums[last4] != 4) {
                ++last4;
            }
            nums[last4] = nums[i + 1];
            nums[i + 1] = 4;
            ++last4;
        }
    }
    return nums;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...