测试员的算法面试题

 🔥 交流讨论:欢迎加入我们一起学习!

🔥 资源分享耗时200+小时精选的「软件测试」资料包

🔥 教程推荐:火遍全网的《软件测试》教程  

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

算法面试—找众数

前提:

现在测试工程师的面试,或多或少都会问到编程技术.在编程技术中,往往会挑选一个简单的算法题.很多同学一看到这,往往就不知如何是好了.后果轻则被压低薪水,重则失去这次面试机会.

其实面试中的算法,可以通过刷题来进行准备.下面分享下最近面试遇到的算法面试题

题目-寻找一个列表中的众数

给定一个大小为n的数组,找到其中的众数

*众数:是指在数组中出现次数大于"n/2"的元素

示例:

给定数组:list = [1,2,5,5,5,5,7]

预期输出: 5

LV1:直接解题

先用最直接的方式,尝试转化题目

def func(num:list): #定义一个函数,接收"列表"数据

res = []                #定义一个变量接收结果 
  • 1

对于大于"n/2"这条需求,可以先求出n

n = len(num) #用len函数得到n

找到数组里的众数,可以理解为:在数组中进行循环比较.

条件是 当前元素出现次数(list.count()函数可以得出)大于 n/2

如果符合条件,则存到res变量中

对于大于"n/2"这条需求,可以先求出n

for i in num: #遍历num
now_time = num.count(i) #得到当前遍历项的出现次数
if now_time > n/2: #如果该数字出现次数大于n/2
res.append(i) #则加入结果

由于循环中,会把每一个众数都加到结果中得到如下结果

[5, 5, 5, 5]

所以在加一部去重复数据

return set(res)

结果:
在这里插入图片描述
免费领取 码同学软件测试 课程笔记+超多学习资料+完整视频+最新面试题,可以转发文章 + 私信「码同学666」获取资料哦

Lv2:简化

上述方案中,力求快速实现需求.在细节上比较冗余,这里在进行一步简化.

def func(num:list): #定义一个函数,接收"列表"数据
# res = [] #实际上由于众数的规则(数量>一般),一个数组中只可能有一个.所以遇到直接返回就好了
# n = len(num) #把这步计算直接放到if条件中
for i in num: #遍历num
# now_time = num.count(i) #可以将这个计算直接放到条件上
if num.count(i) > len(num)/2: #可以将n/2的计算,直接放到这
return i #则加入结果

效果如下:
在这里插入图片描述

LV3效率优化

从功能的角度来说,上述方案是可行的.但是一旦遇到海量数据,重复计算list.count()非常耗时.如图:
在这里插入图片描述

这个测试数据中有5w+个元素,计算非常巨大
在这里插入图片描述

重新思考题目中的众数,发现几个特性:

①一个数组中最多只有1个众数(不会出现2个过半数的元素)

②如果数组是从大到小排列(list.sort()函数可以进行排序),那么中间的那个数字一定是众数

③对于数组而言,也分奇数/偶数元素

如果是奇数

数组的元素数量是奇数

l = [1,1,3,3,3]
print(len(l) // 2)可以使用"整除"得到中点

这时恰好取到数组的中点,那么取到的一定是众数

如果是偶数

数组的元素数是偶数

l = [1,1,3,3,3,3]
print(len(l) // 2)

取到的是绝对中点向后取整,此案例使4/7

此时的众数也一定是>7/2,即至少出现4次

所以l[len(2//l)]一定是众数

重写:

数组的元素数是偶数

def majorityElement(nums):
nums.sort()
return nums[len(nums) // 2]

效果如图:
在这里插入图片描述
结论:速度比起直接解法,快了20倍以上

最后我邀请你进入我们的【软件测试学习交流群:785128166】, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:程序员二黑】自提!

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值