<p>Given an integer array <code>nums</code>, return <em>an array</em> <code>answer</code> <em>such that</em> <code>answer[i]</code> <em>is equal to the product of all the elements of</em> <code>nums</code> <em>except</em> <code>nums[i]</code>.</p>

<p>The product of any prefix or suffix of <code>nums</code> is <strong>guaranteed</strong> to fit in a <strong>32-bit</strong> integer.</p>

<p>You must write an algorithm that runs in&nbsp;<code>O(n)</code>&nbsp;time and without using the division operation.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<pre><strong>Input:</strong> nums = [1,2,3,4]
<strong>Output:</strong> [24,12,8,6]
</pre><p><strong class="example">Example 2:</strong></p>
<pre><strong>Input:</strong> nums = [-1,1,0,-3,3]
<strong>Output:</strong> [0,0,9,0,0]
</pre>
<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>2 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
	<li><code>-30 &lt;= nums[i] &lt;= 30</code></li>
	<li>The product of any prefix or suffix of <code>nums</code> is <strong>guaranteed</strong> to fit in a <strong>32-bit</strong> integer.</li>
</ul>

<p>&nbsp;</p>
<p><strong>Follow up:</strong>&nbsp;Can you solve the problem in <code>O(1)</code>&nbsp;extra&nbsp;space complexity? (The output array <strong>does not</strong> count as extra space for space complexity analysis.)</p>

auto init = []() {
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);
    return 'C';
    }();

class Solution {

public:

    std::vector<int> productExceptSelf(std::vector<int>& nums) {
        
        int mulNums = 1;
        static constexpr auto npos = static_cast<size_t>(-1); 
        auto posZero = npos; 
        auto size = nums.size();

        for (size_t i = 0; i < size; ++i) {
            int num = nums[i];

            if (num) {
                mulNums *= num;
            }
            else {
                if (posZero != npos) {
                    std::fill(nums.begin(), nums.end(), 0);
                    return std::move(nums);
                }
                posZero = i;
            }
        }

        if (posZero != npos) {
            std::fill(nums.begin(), nums.end(), 0);
            nums[posZero] = mulNums;
            return std::move(nums);
        }

        for (size_t i = 0; i < size; ++i)
            nums[i] = mulNums / nums[i];

        return std::move(nums);
    }
};

37500