大概是前年的时候,一次出去面试遇到的一道题,但是面试官是我见过的所有面试中,考法挺特别的,其实特别之处呢,是笔试程序后,面试官说回答的是对的,但是面试官立即让我写单元测试,可是但是面试的时候,我是很懵逼的,第一次遇到这种情况,我当时写的是不是一个函数,也不是一个类, 让我单测,为了去单测,我不得不去修改当时的代码,最后单元测试是完成了,但是对于我来说是很尴尬的,我写完就知道当次面试肯定不过的。后来结果也验证了我的猜想,我当时没有对代码进行一定的设计。
首先给大家一个编程题的切题四件套,让大家完美应对所有面试题
- 询问细节、边界条件、可能出现的极端错误情况
- 所有可能的解法和面试官沟通一下(时间复杂度,最优解)
- 写代码
- 写过的代码怎么去设计测试
那么今天我来给大家看看这道题目,当时面试官给到的题目是这样的
给定一个list,要求把里面的数字处理成偶数在左边,奇数在右边,不借助其他列表
分析:
题目是不难,我们知道给定的是一个list,我们要找list的里面的奇偶元素,那我去循环遍历里面的元素。是偶数的我们就移除后在插入。那么我们看看这道题怎么去用代码去实现。
def listto(insert_list):
if type(insert_list)==list:
if len(insert_list)==1 :
if type(insert_list[0]) is not int:
return False
return insert_list
for item in insert_list:
try:
if item%2==0:
insert_list.remove(item)
insert_list.insert(0,item)
except :
return False
return insert_list
else:
return False
对应的单元测试。
from listone import listto
import unittest, ddt
data = [{'list': [0], 'result': [0]},{'list': ["a"], 'result': False}, {'list': 0, 'result': 0},{'list': [1, 1], 'result': [1, 1]},
{'list': [1, 2], 'result': [2, 1]},{'list': [1, 2, 3], 'result':
[2, 1, 3]},{'list': [1, 2, 3,'4'], 'result': False}]
@ddt.ddt
class MyTestCase(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
@ddt.data(*data)
def test1(self, data):
self.assertEqual(listto(data['list']), data['result'])
if __name__ == '__main__':
unittest.main()
到这里这道题,就实现了完毕了。
其实这只是千万的面试题中的一个特例,也只是很多面试题中的冰山一角。无论是面试,还是工作,我们一定要对代码有一定的设计。设计的代码要有一定的前瞻性。要可以拓展,可以扩充。这里可以总结一下,编程题不仅仅考察大家的代码水平,
- 考察遇到问题的沟通能力
- 编程思路及编程思想
- 编程中代码能力
- 代码编写完成后设计测试用例的完善
综合下来才是编程题的得分,希望大家遇到编程题不要害怕,多沟通多思考才是面试重点