Hier ist mein Versuch, es in Java zu lösen. Entschuldigung für die nicht standardmäßige Formatierung, aber der Code weist viele Duplikate auf, und dies ist das Beste, was ich tun kann, um ihn lesbar zu machen.
import java.util.Arrays;
public class Products {
static int[] products(int... nums) {
final int N = nums.length;
int[] prods = new int[N];
Arrays.fill(prods, 1);
for (int
i = 0, pi = 1 , j = N-1, pj = 1 ;
(i < N) && (j >= 0) ;
pi *= nums[i++] , pj *= nums[j--] )
{
prods[i] *= pi ; prods[j] *= pj ;
}
return prods;
}
public static void main(String[] args) {
System.out.println(
Arrays.toString(products(1, 2, 3, 4, 5))
); // prints "[120, 60, 40, 30, 24]"
}
}
Die Schleifeninvarianten sind pi = nums[0] * nums[1] *.. nums[i-1]
und pj = nums[N-1] * nums[N-2] *.. nums[j+1]
. Der i
linke Teil ist die "Präfix" -Logik, und j
der rechte Teil ist die "Suffix" -Logik.
Rekursiver Einzeiler
Jasmeet gab eine (schöne!) Rekursive Lösung; Ich habe daraus diesen (abscheulichen!) Java-Einzeiler gemacht. Es werden Änderungen an Ort und Stelle mit O(N)
temporärem Speicherplatz im Stapel vorgenommen.
static int multiply(int[] nums, int p, int n) {
return (n == nums.length) ? 1
: nums[n] * (p = multiply(nums, nums[n] * (nums[n] = p), n + 1))
+ 0*(nums[n] *= p);
}
int[] arr = {1,2,3,4,5};
multiply(arr, 1, 0);
System.out.println(Arrays.toString(arr));
// prints "[120, 60, 40, 30, 24]"