/**
 * Given an integer array nums,
 * return an array answer such that answer[i] is equal to the product of all the elements of nums except nums[i].
 *
 * The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.
 *
 * You must write an algorithm that runs in O(n) time and without using the division operation.
 *
 *
 *
 * Example 1:
 *
 * Input: nums = [1,2,3,4]
 * Output: [24,12,8,6]
 * Example 2:
 *
 * Input: nums = [-1,1,0,-3,3]
 * Output: [0,0,9,0,0]
 *
 *
 * Constraints:
 *
 * 2 <= nums.length <= 105
 * -30 <= nums[i] <= 30
 * The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.
 *
 *
 * Follow up: Can you solve the problem in O(1) extra space complexity?
 * (The output array does not count as extra space for space complexity analysis.)
 * @see <a href="https://leetcode.com/problems/product-of-array-except-self/">LeetCode</a>
 */
fun productExceptSelf(nums: IntArray): IntArray {
    val outputArray = IntArray(nums.size)
    var productBefore = 1
    for (index in nums.indices) {
        outputArray[index] = productBefore
        productBefore *= nums[index]
    }
    var productAfter = 1
    for (index in nums.indices.reversed()) {
        outputArray[index] *= productAfter
        productAfter *= nums[index]
    }
    return outputArray
}

/**
 * Given an integer array nums,
 * return an array answer such that answer[i] is equal to the product of all the elements of nums except nums[i].
 *
 * The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.
 *
 * You must write an algorithm that runs in O(n) time and without using the division operation.
 *
 *
 *
 * Example 1:
 *
 * Input: nums = [1,2,3,4]
 * Output: [24,12,8,6]
 * Example 2:
 *
 * Input: nums = [-1,1,0,-3,3]
 * Output: [0,0,9,0,0]
 *
 *
 * Constraints:
 *
 * 2 <= nums.length <= 105
 * -30 <= nums[i] <= 30
 * The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.
 *
 *
 * Follow up: Can you solve the problem in O(1) extra space complexity?
 * (The output array does not count as extra space for space complexity analysis.)
 * @see <a href="https://leetcode.com/problems/product-of-array-except-self/">LeetCode</a>
 */
fun productExceptSelf(nums: IntArray): IntArray {
    val outputArray = IntArray(nums.size)
    var productBefore = 1
    for (index in nums.indices) {
        outputArray[index] = productBefore
        productBefore *= nums[index]
    }
    var productAfter = 1
    for (index in nums.indices.reversed()) {
        outputArray[index] *= productAfter
        productAfter *= nums[index]
    }
    return outputArray
}
