代码挑战:在Swift中遍历数据结构


最近,我有机会帮助iOS面试计划的学生为大多数人认可的公司准备了一次重要的技术面试。 总体而言, 我的课程融合了代码挑战和实时白板会话的组合,测试了人们在Swift中实现语法,设计模式和算法的能力。

挑战

有时,我会听到人们回覆他们的采访经历。 有时,某些类型的问题会使开发人员感到惊讶。 如果您意识到了挑战,那就太好了! 对于我们其他人,这里是摘要:

  //给出以下树: 
// 1
// 2 3
// 4 5 7
// 8 9


//由此类实现:
基站 {

var键:T?
左变数: 基站
右: 基站
var高度: 整数

在里面() {
自。 高度 = -1
}
}

//使用以下函数获取以下输出:
//预期输出:
// 1
// 2 3
// 4 5 7
// 8 9

//结果:1 2 3 4 5 7 8 9

分析

关于挑战的有趣之处在于它衡量的事物数量。 这包括一个人的一般技术背景,对Swift的理解以及计算机科学原理。 作为新手或经验丰富的iOS开发人员,我们习惯于使用本机Swift类型(例如Array’s&Dictionaries)。 这样,很容易遍历这些元素列表。 我们可以使用快速枚举在线性时间内遍历一个数组— O(n):

序列 数组    = [1、2、3、4、5、6、7] 

//线性时间-O(n)
功能 linearSearch(用于值:Int,列表: 数组 )-> 布尔 {

//遍历值的范围
对于 清单{
如果数字==值{
返回 真正
}
}

返回
}

对于我们的挑战,困难在于基于树的结构不是一维的。 结果,无法应用快速枚举技术。 为了解决这个问题,我们需要提出一种替代方法来考虑根节点以下的值(例如1)。 这个想法可以认为是树的深度 。 考虑以下更详细的视图:

实施

为了满足我们的标准,我们可以应用广度优先搜索(BFS)技术。 与涉及计数,排序或字符串处理的典型面试问题不同,BFS具有特定的目的,否则很难复制。 关于遍历,优点是BFS基于发现。 当遍历复杂的开放式系统(如图形和树)时,此过程可提高灵活性。 考虑以下:

  //宽度优先搜索-遍历树 

功能 BFSTraverse ()->(){

//建立队列
让bsQueue = Queue < 基站 ()

//排队起始节点
bsQueue.enQueue(

!bsQueue.isEmpty(){

//遍历下一个排队的节点
守护 让bitem = bsQueue.deQueue() 其他 {
打破
}

打印 (“现在遍历的项目:\(bitem.key!)”)

//将后代添加到队列
如果 让左= bitem.left {
bsQueue。 排队 (剩下)
}

如果 让权利= bitem.right {
bsQueue。 排队 (对)
}


} //结束

打印 (bfs遍历完成。”)

}

如上所示,该代码是通过使用队列来实现的。 使用队列安排项目是理想的选择,因为它可以确保以先进先出的方式遍历对象。 正是这个过程使我们能够按顺序打印挑战中的元素。 同样,由于模型基于发现,因此算法将继续搜索新项目,直到队列为空。 在此示例中,BFS算法使用自定义队列。 但是,可以通过使用数组来实现类似的排队功能。


喜欢这篇文章吗? 阅读并发现有关 Medium的 Swift算法书