最近刚学习了一下go的语法,一般检验语法的学习成果都是通过算法题来的。twoSum作为一个各个语言都会考查的经典题目,在这里自然是要体验一番的。
题目的要求就不赘述了,毕竟大家都耳熟能详了。这里就直接开始解题。 这里就通过两个常见的方法来实现:
1.通过map来实现
思路:
1.1 我们通过保存数组的值作为map的key,数组的下标作为value
1.2 我们在循环的时候,判断一下 target(就是题目给定的两数和)减去当前的数组值
res := target - nums[i]
因为我们之前保存了对应的key,value. 如果map1[res]是存在的,表示当前的nums[i] + res == target,这个时候刚好两数和就是target。我们直接返回对应的下标即可,talk is cheap!
func twoSum(target int, nums []int) (int, int) {
var map1 = map[int]int{}
for i := 0; i < len(nums); i++ {
var res int = target - nums[i]
_, ok := map1[res]
if ok == true {
return map1[res], i
}
map1[nums[i]] = i
}
return -1, -1
}
2.通过while来实现
看到while,大家估计就纳闷了,go哪来的while循环。确实没有,但是我们可以模拟呀。 这个是c/c++最常见的一种解法,同样可以用go来实现
思路: 首尾指针
2.1.首指针先不动,尾指针向左移动,如果首尾数相加为target结束
2.2.如果尾指针移动到了首指针的下一位,说明第一轮结束了,首指针需要向右移动一位,尾指针则回到最右边,开始新一轮的向左移动,直到首尾数相加为target结束
2.3.如果一直到首指针到了数组倒数第二位,尾指针在倒数第一位,两个相加还不能等于target,说明数组不存在两数和为target
code,code,code!
func twoSum(target int, nums []int) (int, int) {
var start int = 0
var end int = len(nums) - 1
for {
if start < len(nums) - 1 {
if nums[start] == target - nums[end] {
return start, end
}
if start == end - 1 {
start++
end = len(nums) - 1
} else {
end--
}
fmt.Println(start, end)
}
}
return -1, -1
}
当然这个题目还有很多很好的办法实现,这个只是最简答的两种。也算是对go的一次体验吧。