我一直在用 Go 的当前产品总和示例练习编码面试问题。基本上,您需要获取一个嵌套数组并返回它的乘积总和。
示例:[1,3,[2,[5],-3],7] = 1 + 3 + 2*(2-3) + 3*(5) + 7 = 24
这也应该等于:1 + 3 + 2*(2) + 2*(-3) + 3*5 + 7 = 24
但是,当我尝试在代码中实现它时,我只能得到第一个示例。
func ProductSum(array []interface{}) int {
sum := productSum(array, 1)
fmt.Println(sum)
return sum
}
func productSum(array SpecialArray, multiplier int) int {
sum := 0
for _, el := range array {
if cast, ok := el.(SpecialArray); ok {
sum += productSum(cast, multiplier+1)
} else if cast, ok := el.(int); ok {
sum += cast
}
}
return sum * multiplier
}
如果我将 sum += cast
更改为 sum += cast * multiplier
,并将 return sum * multiplier
更改为 return sum
- 那么该函数无法按预期工作。我已经尝试通过递归堆栈来解决这个问题,但仍然很困惑。
答案 0 :(得分:0)
根据您的代码,“数组符号”应转换为以下等式:
[1,3,[2,[5],-3],7] = 1*(1 + 3 + 2*(2 + 3 * (5) - 3) + 7) = 1 + 3 + 2*(2 - 3 + 15) + 7 = 11 + 14 * 2 = 39
或
[1,3,[2,[5],-3],7] = 1*(1 + 3 + 2*(2 + 3 * (5) - 3) + 7) = 1 + 3 + 2*(-1) + 6 * 5 + 7 = 11 - 2 + 30 = 39
在您的解释中,每一级嵌套都会使乘数增加一。
你能粘贴一下这个练习的确切内容吗?
编辑:
要获得 24 的结果,您的代码应如下所示:
func ProductSum(array []interface{}) int {
sum := productSum(array, 1)
fmt.Println(sum)
return sum
}
func productSum(array []interface{}, multiplier int) int {
sum := 0
for _, el := range array {
if cast, ok := el.([]interface{}); ok {
sum += productSum(cast, multiplier+1)
} else if cast, ok := el.(int); ok {
// Multiplier is applied only to integers in current slice.
sum += multiplier * cast
}
}
return sum
}
数组的总和总是乘以它的嵌套级别。