Đây là nỗ lực của tôi để giải quyết nó trong Java. Xin lỗi về định dạng không chuẩn, nhưng mã có rất nhiều sự trùng lặp và đây là cách tốt nhất tôi có thể làm để làm cho nó dễ đọc hơn.
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]"
}
}
Các bất biến vòng lặp là pi = nums[0] * nums[1] *.. nums[i-1]
và pj = nums[N-1] * nums[N-2] *.. nums[j+1]
. Phần i
bên trái là logic "tiền tố" và j
phần bên phải là logic "hậu tố".
Đệ quy một lớp
Jasmeet đã đưa ra một giải pháp đệ quy (đẹp!); Tôi đã biến nó thành một lớp lót Java (gớm ghiếc!) Này. Nó thực hiện sửa đổi tại chỗ , với O(N)
không gian tạm thời trong ngăn xếp.
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]"