Golang中如何避免使用嵌套循环?
Golang中如何避免使用嵌套循环? 你好,我刚开始学习Go语言,想在这里请教一个问题。我在解决CodeFights上的一个问题时,虽然得到了正确答案,但无法让代码在4秒内执行完成。我猜想可能有比嵌套循环更好的方法?
以下是Go Playground的链接和代码展示。如果有什么明显需要改进的地方,我也很乐意听取建议。
Go Playground: https://play.golang.org/p/AT1EllmUhMI
package main
import (
"fmt"
)
//find the number that is duplicated first in the array
func firstDuplicate(a []int) int {
s := []int{}
for _, fVal := range a {
for _, val := range s {
if val == fVal {
return val
}
}
s = append(s, fVal)
}
return -1
}
func main() {
c := []int{2, 3, 3, 1, 5, 2} //returns 3
d := []int{1, 1, 2, 2, 1} //returns 1
fmt.Println(firstDuplicate(c))
fmt.Println(firstDuplicate(d))
}
更多关于Golang中如何避免使用嵌套循环?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
哇!感谢如此快速而精彩的回复!我也很感谢对结构体部分的解释,我觉得我以前从未见过这样的用法。
更多关于Golang中如何避免使用嵌套循环?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
可以使用映射(map)来实现对已见值的常数时间查找。
package main
import "fmt"
func hasDupe(in []int) bool {
seen := make(map[int]struct{})
for _, v := range in {
if _, ok := seen[v]; ok {
return true
}
seen[v] = struct{}{}
}
return false
}
func main() {
fmt.Println(hasDupe([]int{1, 2, 3, 4, 2}))
fmt.Println(hasDupe([]int{1, 2, 3, 4, 5}))
}
考虑到我们只需要跟踪整数类型,我相信还有更高效的数据结构可以使用。但映射(map)这种方式简单且是语言内置功能。
(struct{}这种特殊用法是零大小类型,因为我们只需要一个映射来记录某个值是否存在,而不需要记录该值具体是什么。)
在Go语言中,避免嵌套循环是提高性能的常见优化策略。对于查找数组中第一个重复元素的问题,可以使用哈希表(在Go中是map)来替代嵌套循环,将时间复杂度从O(n²)降低到O(n)。
以下是优化后的代码:
package main
import (
"fmt"
)
func firstDuplicate(a []int) int {
seen := make(map[int]bool)
for _, val := range a {
if seen[val] {
return val
}
seen[val] = true
}
return -1
}
func main() {
c := []int{2, 3, 3, 1, 5, 2} // 返回 3
d := []int{1, 1, 2, 2, 1} // 返回 1
fmt.Println(firstDuplicate(c)) // 输出: 3
fmt.Println(firstDuplicate(d)) // 输出: 1
}
这个实现使用map来记录已经出现过的元素。遍历数组时,对于每个元素:
- 如果该元素已经在map中存在(值为true),则立即返回该元素
- 否则将该元素添加到map中
这种方法只需要一次遍历,时间复杂度为O(n),空间复杂度为O(n),能够显著提升执行效率,轻松满足4秒的时间限制。

