func productExceptSelfLong(nums []int) []int { l := len(nums) ans := make([]int, l) zero := false zeroIdx, product := -1, 1 for i := 0; i < l; i++ { if nums[i] != 0 { product *= nums[i] } else { if zero { return ans } zero = true zeroIdx = i } } if zero { ans[zeroIdx] = product return ans } for i := 0; i < l; i++ { ans[i] = product / nums[i] } return ans } func productExceptSelf(nums []int) []int { l := len(nums) ans := make([]int, l) memset(ans, 1) for i := 1; i < l; i++ { ans[i] = ans[i-1] * nums[i-1] } for i, tmp := l-2, 1; 0 <= i; i-- { tmp *= nums[i+1] ans[i] *= tmp } return ans } func memset(a []int, v int) { a[0] = v l := len(a) for bp := 1; bp < l; bp *= 2 { copy(a[bp:], a[:bp]) } }