- 为了助力本届青训营课程的学习,青训营项目组为同学们精心挑选了练手习题 📖
- 每两天发布一篇,包含选择题和实操题各一题(第二天将发布答案解析)🥳
- 同学们可以在评论区留下你的解题过程并进行互动交流 ✍️
一、【多选】Golang 通过plugin.(*Plugin).Lookup函数可以查找到插件里面定义的哪些东西?
a. 变量
b. 函数
c. 类型
d. 包
答案 & 解析:
a、b;
a和b都是能被赋值给interface{}类型的变量,但是c和d不能。因此Lookup方法返回的结果是一个interface{}类型(Symbol类型)的变量,因此c和d不能通过Lookup返回。
参考Lookup方法的说明:
func (p *Plugin) Lookup(symName string) (Symbol, error)
Lookup searches for a symbol named symName in plugin p. A symbol is any exported variable or function. It reports an error if the symbol is not found. It is safe for concurrent use by multiple goroutines.
二、假如在抖音中发布视频时,可以选择带上位置信息,请设计一种数据结构或方案,用于存储检索位置信息(简化为平面坐标 x, y),以实现搜索附近视频的功能(如附近 3km)。
答案 & 解析:
坐标范围检索,有四叉树、geohash 等几种标准解法。这道题本质并不是考察对高阶算法的掌握,而是想发掘在学习教材 btree 等基础二分思想后,能否进一步思考解出更复杂的问题;
另外考察思维灵活程度,看是否能变通的解决问题,如距离并没有限定必须是欧式距离;位置可以不精确,可以容忍有误差等。
- 方法 1,四叉树(QTree):在二叉树左、右节点的思想下,加入上、下、前、后等更多的方向,演进为四叉树和八叉树。高阶树比较超纲,相关实现省略
- 方法 2,geohash:把二维问题降为一维
如坐标(示例非标准 geohash,只是演示了思想):
(12, 345) -> (012, 345) -> "031425"
(13, 348) -> (013, 348) -> "031438"
(2, 789) -> (002, 789) -> "070829"
最终做字符串前缀匹配,可得 "031425" 和 "031438" 匹配到的位数最多,二者距离最近。求 3km 内的坐标,只需提前算出需匹配前几位即可,如匹配前 4 位,按 sql 表达是 LIKE '0314%' - 方法 3,变通距离为 方圆 3km(曼哈顿距离),即 deltaX = 1500, deltaY = 1500,通过数据库解决 Create table tb_name ( x int, y int ) 并添加索引。
假如原点是 (x0, y0),sql 如下:
WHERE (x > x0 - 1500) AND (x < x0 + 1500) AND (y > y0 - 1500) AND (y < y0 + 1500)
今天是刷题打卡第一天,让我们康康谁是最积极的小可爱 👀