@[C++|面试|数据结构|算法]
高质量的代码
代码的规范性
- 书写清晰
- 布局清晰
- 命名合理
代码的完整性
- 完成基本功能
- 考虑边界条件
- 做好错误处理
代码的鲁棒性
- 采取防御式编程
- 处理无效的输入
优化时间和空间效率
编程面试的时候,面试官通常对时间复杂度和空间复杂度都会有要求,并且一般情况下面试官更加关注时间复杂度。
降低时间复杂度的方法:
- 改用更加高效的算法,如联想快速排序中的Partition,采用动态规划等算法
- 用空间换取时间,经常通过辅助内存和简单的哈希表,实现利用较小的空间的消耗提高时间效率
当然,也不是所有情况下,以空间换取时间都是可行的
- 如果辅助空间消耗的太多,可能得不偿失
- 如果是在嵌入式开发等对空间要求较高的情况下,也要格外注意空间消耗
解决面试题的思路
画图
图形化能使抽象的问题形象化。当面试题涉及链表、二叉树等数据结构时,如果在纸上画几张草图,题目中隐藏的规律就有可能变得很直观。
举列
一两个例子能使抽象的问题具体化。很多与算法相关的问题都很抽象,未必一眼就能看出它们的规律。这个时候我们不妨举几个例子,一步一步模拟运行的过程,说不定就能发现其中的规律,从而找到解决问题的窍门。
分解
把复杂的问题分解成若干个小问题,是解决很多复杂问题的有效方法。如果我们遇到的问题很大,可以尝试先把大问题分解成小的问题,然后递归地解决这些小问题。分治法、动态规划等方法都是应用分解复杂问题的思路。
面试中的各项能力
“应聘者会被问及一些需求不是很明确的问题,解决这些问题需要应聘者和面试官进行沟通,以及在讲解思路和代码的过程中与需要和面试官交流互动。沟通及学习能力是面试成绩中关键的考察点。” ——尧敏(淘宝,资深经理)
应聘者的综合素质
- 编程能力
- 沟通能力
- 学习能力
- 知识迁移能力
- 发散思维能力
- 抽象建模能力
- ...
沟通能力和学习能力
随着软件、系统功能越来越复杂,开发团队的规模越来越大,开发者、测试者和项目经理的沟通交流变得越来越重要。因此在面试过程中,面试官也越来越看重沟通能力,因此也常常在面试的过程中,面试题描述比较含糊,从而希望应聘者能够主动沟通,充分理解题意,有效表达自己的想法和见解。
而对于学习能力,由于软件技术发展日新月异,只有具备很强的学习能力和学习欲望的人,才能不断完善自己的知识结构,不断学习新的现金技术,让自己职业生涯保持长久的生命力。
知识迁移能力
知识迁移能力的通俗说法就是“举一反三”的能力。能够根据已知的知识来理解新的概念,以及根据解决一道题的思路,从而去解决一类问题。如面试题求解二叉树的深度:
int TreeDepth(BinaryTreeNode* pRoot)
{
if(pRoot == NULL)
return 0;
int nLeft = TreeDepth(pRoot->m_pLeft);
int nRight = TreeDepth(pRoot->m_pRight);
return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
}
知识迁移能力能够帮助我们轻松地解决很多问题。有些面试官在提问难题之前,会问一道相关但比较简单的题目,也是希望我们能够从解决问题的过程中受到启发,最总解决较为复杂的问题。
抽象建模能力
- 建模的第一步就是选择合理的数据结构来表述问题。实际生产生活中的问题千变万化,而常用的数据结构却只有有限的几种。
- 建模的第二部就是分析模型中的内在规律,并用编程语言表述这种规律。
发散思维能力
- 发散思维的特点是思维活动的多向性和变通性,也就是我们在思考问题时注重运用多思路、多方案、多途径地解决问题。
- 通过考查发散思维能力,面试官能够
- 了解应聘者探索新思路的激情
- 了解应聘者的灵活性和变通性
- 了解面试者知识面的广度和深度
备注:文中主要内容参考《剑指Offer》——何海涛,书中有很多编程实例,就不在这里赘述了,推荐急于找工作的同学和感兴趣的人阅读
网友评论