
慧测微课程活动正式启动。持续关注慧测,每天进步一点!
讲师:张老师
本期语音讲解

各位测试界小伙伴们:
大家好,我是慧测的张老师,
欢迎大家参加慧测的2019年系列微课程活动。
本套课程主要分为两部分内容:
《每期一道名企面试题分析》
《每期5分钟测试开发小课堂》
目的是让大家利用好碎片化时间,每天积累一点技术。
今天是我们《每期一道名企面试题分析》微课程的第3期内容。
题目
用Python写一个函数, 从一个整型列表中找到两个元素间的最小差值,
输出这个最小差值,和对应的两个元素的下标。
1.根据函数功能,我们可以给这个函数命名为find_min_diff, 形参应代表一个整型数组,我们把它命名为numbers。
def find_min_diff(numbers):
pass
2. 如果我们要找的是一个列表中的最小值,在不能使用系统内建函数min的情况下,通常的思路是,假定第一个数是最小的,它的下标0记为最小值对应的下标。
然后循环遍历一遍列表,每次遍历到的元素,都和当前的最小值进行比较;
如果比最小值还小,就把这个元素的值记为最小值,把它的下标记为最小值对应的下标。
如果遍历到的元素不比当前最小值值小,就不做操作。大家可以暂停播放,浏览一下这段代码。
def find_min_num(numbers):
min_num = numbers[0]
min_index = 0
for i in range(len(numbers)):
if numbers[i] < min_num:
min_num = numbers[i]
min_index = i
print('最小值是%d,它的下标为%d'% (min_num, min_index))
现在的题目,要求找的是两个元素的最小差值,我们可以先假定:
第1个数减去第2个数之间差值是最小的,它们的下标0和1记为最小差值的两个元素对应的下标。
def find_min_diff(numbers):
diff = numbers[0] - numbers[1]
id1 = 0
id2 = 1
pass
然后循环遍历列表,元素之间两两组对,计算差值。
每次计算出的差值,都和当前的最小差值进行比较;
如果比最小差值还小,就把新求得的差值记为最小值,把新的两个元素的下标记为最小差值对应元素的下标。
如果求得的差值不比当前值小,就不做操作。
每次求一个差值,我们需要先指定一个被减数,这个被减数应该从列表的第1个元素开始,一直到最后一个元素。
所以需要一个循环来控制,使用range(len(numbers))来表示被减数的下标的范围。
也就是:
def find_min_diff(numbers):
diff = numbers[0] - numbers[1]
id1 = 0
id2 = 1
for i in range(len(numbers)):
pass
因为两个数之间的差值有正负,所以被减数和减数之间交换位置后值不相等,所以每确定了一个被减数,列表中所有元素都需要充当一次减数,而不用考虑排除掉已用过的数。
也就是说,减数的范围也是从列表的第1个元素开始,一直到最后一个元素。
也就是内层嵌套一个循环,用一个变量表示减数的下标,范围也是
range(len(numbers))。
def find_min_diff(numbers):
diff = numbers[0] - numbers[1]
id1 = 0
id2 = 1
for i in range(len(numbers)):
for j in range(0, len(numbers)):
pass
有一个特殊情况,就是减数与被减数下标相同。
这种情况是可以在循环内部通过if条件排除的,但不排除对结果也没有影响;
因为自己跟自己求差结果一定是0,只要列表中有任意两个元素不相同,就一定存在比0小的差值,所以求出的0对结果没有影响。
如果所有元素都相同,则不需要对diff、id1和id2重新赋值,结果中会显示下标为0和1的元素之间差值最小。这个结果也正确。
按照上面的分析过程,我们可以把代码完成。
def find_min_diff(numbers):
diff = numbers[0] - numbers[1]
id1 = 0
id2 = 1
for i in range(len(numbers)):
for j in range(0, len(numbers)):
if numbers[i] - numbers[j] < diff:
id1 = i
id2 = j
diff = numbers[i] - numbers[j]
print(id1,id2,diff)
num = [2,3,13,7,13]
find_min_diff(num)
完成后,你可以再思考下,如果题目要求中差值改成绝对值,你应该对代码做什么相应的改动呢?
以上就是今天面试题分享的全部内容。

-END-
上期回顾:
欢迎加入慧测学习社区


欢迎加入我们:
慧测官网:www.huicewang.com
慧测Python群:324015481
公开课服务群:623636110
咨询QQ:2657535456
咨询微信号:huice666

慧测腾讯课堂 课程地址:


