两数之和最容易想到的方法是通过暴力枚举 ,通过嵌套循环的方式枚举数组中每一个 x
,在剩余元素中是否存在 target-x
。
Go
func twoSum(nums []int, target int) []int {
length := len(nums)
for i :=0; i < length; i++ {
for j := i+1; j < length; j++ {
v_s := nums[i]
v_c := nums[j]
if v_c + v_s == target {
return []int{i, j}
}
}
}
return nil
}
从代码中,涉及到变量的定义、循环和条件判断。
变量的定义与初始化
基础类型变量:
Go
// 声明: var [变量名] [数据类型]
var x int
// 赋值:[变量名] = [具体值]
x = 5
// 简写:[变量名] := [具体值]
y := 6
数组类型:
Go
// 声明:var [变量名] [数组长度] [数据类型]
var arr [2]int
// 赋值:[变量名][数组下标] = [具体值]
arr[0] = -1
// 简写:[变量名] := [数组长度][数据类型]{具体值}
arr2:= [2]int{-1, 1}
对于声明与定义变量,JavaScript 习惯性的用 const
修饰 length
,在这里是不被允许的。为什么呢,Go 作为强类型的静态语言要求 length
的值在编译时确认 ,而不是在运行时期,因此无法 将 length
视作常量。
循环与条件控制
此处 Go 与 JavaScript 基本相似,主要区别是 Go 不需要括号包裹判断条件。
暴力枚举法的时间复杂度过高,可以考虑哈希表法 用空间换时间。创建哈希表后,对于数组中每一个 x
都检查哈希表中是否存在 target -x
Go
func twoSum(nums []int, target int) []int {
set := make(map[int]int)
for i :=0; i < length; i++ {
idx, res := set[target - nums[i]]
if res {
return []int{i, idx}
}
set[nums[i]] = i
}
return nil
}
此时,出现了新知识点哈希表的使用
哈希表
Go 称之为映射,且需要通过内置的 make
函数创建
Go
// 初始化 [变量名] := make(map[key数据类型][value数据类型])
m := make(map[string]int)
// 插入
m["a"] = 1
// 判断 key 存在
value, ok := m["c"] // ok: boolean,key 存在则为 true
小结
边学边练,日拱一卒!我们已经从 twosum
中学习到 Go 中关于变量的定义和初始化、循环和条件控制以及哈希表的使用啦。