জাভাতে এটি সমাধান করার জন্য আমার চেষ্টা এখানে। অ-মানক বিন্যাসের জন্য ক্ষমাপ্রার্থী, তবে কোডটির প্রচুর অনুলিপি রয়েছে, এবং এটি পাঠযোগ্যযোগ্য করার জন্য আমি সবচেয়ে সেরা এটি করতে পারি।
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]"
}
}
লুপ আক্রমণকারীরা pi = nums[0] * nums[1] *.. nums[i-1]
এবং pj = nums[N-1] * nums[N-2] *.. nums[j+1]
। i
বাম অংশ "উপসর্গ" যুক্তিবিজ্ঞান, এবং j
ডান দিকে অংশ "প্রত্যয়" যুক্তি নেই।
পুনরাবৃত্ত ওয়ান-লাইনার
জস্মিত একটি (সুন্দর!) পুনরাবৃত্তি সমাধান দিয়েছেন; আমি এটিকে (জঘন্য!) জাভা ওয়ান-লাইনারে পরিণত করেছি। এটি স্ট্যাকের মধ্যে অস্থায়ী স্থান সহ, স্থানটিতে সংশোধনO(N)
করে।
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]"