← Notas de desarrollo

Secuencia de paso x en Java: ampliar el tipo antes de multiplicar

Los n valores que empiezan en x van de x × 1 a x × n. Como los resultados pueden superar el rango de int, tanto el array de salida como la propia multiplicación deben usar long.

El ejercicio limita x entre -10 000 000 y 10 000 000, y n entre 1 y 1 000. El último valor puede tener una magnitud de 10 000 000 000, por lo que requiere un array de long.

Flujo de procesamiento

Convierte los índices desde cero en números de término, amplía x a long antes de multiplicar y recoge los valores en orden.

Convierte los índices desde cero en números de término, amplía x a long antes de multiplicar y recoge los valores en orden.

Convertir un índice en un número de término

Guarda esta clase completa como Solution.java. El código del artículo original se compiló para Java 11 y se ejecutó en JDK 17.

import java.util.stream.IntStream;

public class Solution {
    public long[] solution(int x, int n) {
        return IntStream.range(0, n)
                .mapToLong(i -> (long) x * (i + 1))
                .toArray();
    }
}

IntStream.range(0, n) genera índices de 0 a n-1. Al multiplicar por i + 1, el primer valor es x y el último x×n. Empezar en x×0 cambiaría la secuencia solicitada.

x n Resultado
2 5 [2,4,6,8,10]
-4 2 [-4,-8]
0 3 [0,0,0]

Un x negativo produce valores decrecientes, mientras que x=0 solo produce ceros. Conserva el orden de los términos: no es un problema de ordenación.

mapToLong por sí solo no protege el producto

Incluso dentro de mapToLong, evaluar primero x * (i + 1) usa multiplicación de int porque ambos operandos son int. (long) (x * (i + 1)) también convierte después de que se haya producido el desbordamiento.

El ejemplo amplía primero un operando con (long) x * (i + 1). Las comprobaciones del artículo original comparan los arrays de referencia completos que terminan en 10 000 000 000 y -10 000 000 000 para los límites positivo y negativo. También comparan entradas positivas, negativas y nulas más pequeñas con arrays construidos mediante sumas repetidas.

El tiempo es O(n) y el espacio, incluido el array devuelto, es O(n). La implementación sigue las condiciones del ejercicio, sin validar de forma general el tamaño de una secuencia ni entradas arbitrarias de una API.

Compara las sumas con signo y los productos escalares de arrays para cálculos que caben en int dentro de sus límites. La guía de ejercicios Java conecta los cálculos de arrays con cadenas y colecciones.

Comentarios

Ver en GitHub ↗