diff --git a/pullrequests/product_of_array_except_self/step1.go b/pullrequests/product_of_array_except_self/step1.go new file mode 100644 index 0000000..dd80caa --- /dev/null +++ b/pullrequests/product_of_array_except_self/step1.go @@ -0,0 +1,35 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +時間:6分 +全体の積を求め、個々の数字で割ることで求める。 +解いた後に割り算を使ってはいけないということに気づいた。 +*/ +func productExceptSelfStep1(nums []int) []int { + allProduct, zeroCount := 0, 0 + for _, n := range nums { + if n == 0 { + zeroCount++ + continue + } + if allProduct == 0 { + allProduct = n + } else { + allProduct *= n + } + } + products := make([]int, len(nums)) + for i := range products { + if zeroCount > 0 { + if nums[i] == 0 && zeroCount == 1 { + products[i] = allProduct + } else { + products[i] = 0 + } + } else { + products[i] = allProduct / nums[i] + } + } + return products +} diff --git a/pullrequests/product_of_array_except_self/step2.go b/pullrequests/product_of_array_except_self/step2.go new file mode 100644 index 0000000..864039e --- /dev/null +++ b/pullrequests/product_of_array_except_self/step2.go @@ -0,0 +1,20 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +他の人の解法を見て書いた。 +*/ +func productExceptSelfStep2(nums []int) []int { + products := make([]int, len(nums)) + leftProduct := 1 + for i := 0; i < len(nums); i++ { + products[i] = leftProduct + leftProduct *= nums[i] + } + rightProduct := 1 + for i := len(nums) - 1; i >= 0; i-- { + products[i] *= rightProduct + rightProduct *= nums[i] + } + return products +}