原文地址:记一道Go后端笔试题-Top相关
先来看题目:从K个元素的数据类型为int型的array中找到最大的两个数,分别用循环算法和递归算法来写。
上述题目是同事面试Go的时候分享出来的一道题目,刚好最近有面试,就拿来练练手,接下来分享一下解题的思路。
看到题目的第一感觉,认为是从一定数量的元素中取Top多少的问题,这种问题的常规方案就是利用堆排序的方案来解决,堆的初始容量为Top的数目,堆顶的元素是最小的,开始只需将slice前Top个元素放入堆中,之后从第Top+1个元素开始循环递归比较并放入堆中就可完成上述问题。
理想是丰满的,现实是残酷的,关于堆相关算法对目前来说还不是很熟练,所以只好另辟蹊径,采用硬性循环以及粗暴递归的方式来解决问题。
硬性循环代码案例如下:
package main
import "fmt"
func main() {
first, second := 0, 0
s1 := []int{1, 2, 11, 25, 24, 22, 4, 5, 7, 9}
for i := 0; i < len(s1); i++ {
sign := s1[i]
switch {
case sign > first && sign > second:
if first > second {
second = first
}
first = sign
case sign <= first && sign > second:
second = sign
case sign > first && sign <= second:
first = sign
default:
}
}
fmt.Println(first, second)
}
粗暴递归代码案例如下:
package main
import "fmt"
func main() {
s1 := []int{1, 2, 11, 25, 24, 22, 4, 5, 7, 9}
s2 := make([]int, 2)
GetTopTwo(s1[1:], s2)
fmt.Println(s2)
}
func GetTopTwo(s1, s2 []int) {
if len(s1) == 0 {
return
}
sign := s1[0]
first := s2[0]
second := s2[1]
switch {
case sign > first && sign > second:
if first > second {
s2[1] = first
}
s2[0] = sign
case sign <= first && sign > second:
s2[1] = sign
case sign > first && sign <= second:
s2[0] = sign
default:
}
GetTopTwo(s1[1:], s2)
}
上述两个方案核心代码就是switch代码块,实现逻辑也很是简单,个人来说还有很大的优化空间,还望各位多多指正。
至此,本次分享就结束了,后期会慢慢补充。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
扫码关注公众号,获取更多优质内容。