Corrige el código: No modifiques el array

Tu amiga está intentando escribir un método que realice las siguientes transformaciones:

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

// Cada vez que se pase x, se deben devolver los siguientes resultados:
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}

El método change() no debe modificar el array original. Después de cada llamada, el valor original de x debe seguir siendo igual a new int[]{3, 3, 3, 3, 3, 3, 3}.

Ella escribe el siguiente 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;
}

¡Ups! Parece que el código modifica el array original. Corrige este código incorrecto para que el método deje de modificar el array original.

Ejemplos

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

// Lo 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}

// Lo que produce el código defectuoso:
Program.change(x, 2) ➞ new int[]{3, 2, 1, 1, 1, 2, 3} // Todo bien hasta ahora...
Program.change(x, 2) ➞ new int[]{3, 1, -1, -1, -1, 1, 3} // El array fue modificado :(

Notas

  • Si esto te resulta confuso, copia y pega el código incorrecto en un REPL de Java y experimenta con él para entender qué hace el método.
  • Pista: Intenta crear una copia del array de entrada.
  • Si esto te resulta familiar, es porque forma parte de una solución para el problema Alfombra concéntrica.