【发布时间】:2016-04-12 15:12:27
【问题描述】:
问题是:找到nums[index1] + nums[index2] == target的两个数字的索引。这是我在golang 的尝试(索引从 1 开始):
package main
import (
"fmt"
)
var nums = []int{0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 25182, 25184, 25186, 25188, 25190, 25192, 25194, 25196} // The number list is too long, I put the whole numbers in a gist: https://gist.github.com/nickleeh/8eedb39e008da8b47864
var target int = 16021
func twoSum(nums []int, target int) (int, int) {
if len(nums) <= 1 {
return 0, 0
}
hdict := make(map[int]int)
for i := 1; i < len(nums); i++ {
if val, ok := hdict[nums[i+1]]; ok {
return val, i + 1
} else {
hdict[target-nums[i+1]] = i + 1
}
}
return 0, 0
}
func main() {
fmt.Println(twoSum(nums, target))
}
nums 列表太长,我总结一下: https://gist.github.com/nickleeh/8eedb39e008da8b47864
这段代码运行良好,但我发现return 0,0 部分很难看,它的运行速度比Julia 翻译慢十倍。我想知道有没有写得很糟糕,影响性能的部分?
编辑: 朱莉娅的翻译:
function two_sum(nums, target)
if length(nums) <= 1
return false
end
hdict = Dict()
for i in 1:length(nums)
if haskey(hdict, nums[i])
return [hdict[nums[i]], i]
else
hdict[target - nums[i]] = i
end
end
end
【问题讨论】:
-
你的列表总是排序的吗?如果是的话,有更好的算法而不需要使用地图。
i+1和i < len(nums)看起来也不对。您将获得越界访问权限。 -
请出示您要比较的 Julia 翻译。
-
另外你如何测量这两个程序的运行时间?
-
@kostya 谢谢!不,列表未排序。我会再考虑
i+1部分。 -
@CodingPickle Julia 的翻译已添加。 (nums太长了,这里贴不上去。我放到gist链接里了。)
标签: performance dictionary go slice