go 的入门算法题 twoSum

97 阅读2分钟

最近刚学习了一下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的一次体验吧。