邻桌小乐最近有些“膨胀”,因为他刷了很多题,背了很多公式。也是天道酬勤,现在一些基本的算法题他已经比较熟练了,二分、快排、二叉树也似乎都不在话下。今天我们就返璞归真一下,来看一道有趣却不简单的模拟代码题。
这里讲一下“模拟”,其实是算法题中的一大类,就是用代码模拟现实世界,然后给出符合要求的输出。此类题目大多不涉及数据结构或算法,或是需要转化后成为经典的算法题。“模拟”的可考察范围一般比较广泛,能够考察候选人真实的代码思考能力和对于各种情况的考虑。
打个比方,各种算法和数据结构就是“降龙十八掌”或者“九阳神功”,而模拟则是内功。只有强大的内功驱动,各种招式才能发挥出更大的效力。
题目
蛇形打印正方形矩阵
样例输入:
[[1,2,3],[4,5,6],[7,8,9]]
样例输出
1->2->3->6->9->8->7->4->5
解法
伪代码
输入的数组为arr
需要拆解的点
- “转角处”坐标的变换
- 循环的条件
对于第一个点,i和j依次变化即可,难度不大
对于第二个点,在题设中是“正方形矩阵”,即行和列的数目是相等的。此时最外圈的条件为行数或列数,此外圈的条件为(行数或列数 - 2)。因为一圈是上下两行。
做到这里,题目其实不难的,但读者朋友可以自己试一下,也不是非常简单,需要掰扯掰扯,梳理梳理才能达到一个正确的解。
进阶
问题到这里,车速并不快,即使在实战面试中,只要能静心分析一下,出了问题单步调试一下,都是可以解决的。
那么,我们来加个速~
题设,是 m * n 的矩阵,即是长方形的矩阵。
样例:
第一组:
输入:[[1,2,3], [4,5,6]]
输出:1->2->3->6->5->4
第二组:
输入:[[1,2,3], [4,5,6],[7,8,9],[10,11,12]]
输出:1->2->3->6->9->12->11->10->7->4->5->8
这里会引入一个问题,即“有没有下一圈”。如果有,再进行输出,如果没有,则结束。
这里我强烈建议读者自己尝试一下,“模拟”的题目不会难到让人下不去手,就是一步一步地把每个过程都用代码敲出来,而其中的难点也就是如何做到每一小步都正确。这其中考察了候选人分析题目的能力和出现问题时解决代码中问题的能力。
好的,去尝试吧~
文章不会跑。怕迷路的话,建议点击收藏,待自己完成了,或实在完不成的时候再来看答案。
下面是一个减速带~
。
。。。
。。。。。
。。。。。。。
。。。。。。。。。
。。。。。。。。。。。
。。。。。。。。。。。。。
。。。。。。。。。。。
。。。。。。。。。
。。。。。。。
。。。。。
。。。
。
亲爱的读者,欢迎回来~
长方形的矩阵会涉及到先判断,再输出的情形
而其中的条件也是通过矩阵的宽高分别计算的
附图为长方形矩阵的代码,可以看到没有取巧的算法,只是代码比较长~
测试用例和输出如下图
总结
在程序员的日常工作中,其实最常使用的代码能力就是“模拟”。它没有太多复杂的算法,但对分析问题、定位问题和细致程度都有较高的考验。
通过“模拟”题的练习,可以增强我们的编码能力,使用“模拟”题进行考察,可以对候选人的硬实力进行较好的评估。
最后,祝大家无论是简单的代码还是复杂的代码都没有bug~
愿天下永远没有P0事故~