Corrija o código: Não altere o array

Sua amiga está tentando escrever um método que realize as seguintes transformações:

int[] x = new int[]{3, 3, 3, 3, 3, 3, 3};

// Sempre que x for passado, os seguintes resultados deverão ser retornados:
Program.change(x, 0); // new int[]{3, 3, 3, 3, 3, 3, 3}
Program.change(x, 1); // new int[]{3, 2, 2, 2, 2, 2, 3}
Program.change(x, 2); // new int[]{3, 2, 1, 1, 1, 2, 3}
Program.change(x, 3); // new int[]{3, 2, 1, 0, 1, 2, 3}

O método change() não deve alterar o array original. Após cada chamada, o valor original de x ainda deve ser igual a new int[]{3, 3, 3, 3, 3, 3, 3}.

Ela cria o seguinte código:

public static int[] change(int[] x, int times) {
  for (int i = 0; i < x.length; i++) {
    int j = 1;
    while (j <= times) {
      if (i >= j && i < x.length - j) {
        x[i]--;
      }
      j++;
    }
  }
  return x;
}

Ops! O código parece alterar o array original. Corrija esse código incorreto para que o método não altere mais o array original.

Exemplos

int[] x = new int[]{3, 3, 3, 3, 3, 3, 3};

// O que queremos:
Program.change(x, 2) ➞ new int[]{3, 2, 1, 1, 1, 2, 3}
Program.change(x, 2) ➞ new int[]{3, 2, 1, 1, 1, 2, 3}

// O que o código com erro produz:
Program.change(x, 2) ➞ new int[]{3, 2, 1, 1, 1, 2, 3} // Até aqui, tudo bem...
Program.change(x, 2) ➞ new int[]{3, 1, -1, -1, -1, 1, 3} // O array foi alterado :(

Notas

  • Se isso parecer confuso, copie e cole o código incorreto em um REPL de Java e faça alguns testes para entender o que o método está fazendo.
  • Dica: Tente criar uma cópia do array de entrada.
  • Se isso parecer familiar, é porque faz parte de uma solução para o problema Tapete concêntrico.