Bull's blog Bull's blog
首页
工作
  • 分类
  • 标签
  • 归档
关于

Bull

首页
工作
  • 分类
  • 标签
  • 归档
关于
  • 马上消费

  • 斗虫

    • 基础课件

      • python基础和条件语句
      • 基础数据类型_改
      • 函数
      • 1 函数练习
      • 32文件操作
      • 3 异常
      • 面向对象
      • 1面向对象案例-学生管理系统
      • 1Python基础练习题
      • 自动化测试理论
      • 2 接口测试基础
      • 3 requests
      • 4 代码
      • 5 简单封装
      • 1 pytest
      • 签名的设计
      • 接口case设计
      • 3 新建一个接口
      • x装饰器语法
      • httprunner2.x工具快速入门
      • httprunner3.x的简介
      • Flask框架
      • 了解任务
      • mock服务
      • UI自动化策略
      • PageObject模式
      • pytest参数化进阶
      • pytest框架生成报告
      • Yaml运用
      • 日志类模板
      • 持续集成
      • jdk配置
      • Linux基础
      • Jenkins主从测试任务
      • conda管理项目环境
      • 面试题-栈结构
      • 面试题-找众数
        • 题目-寻找一个列表中的众数
          • LV1:直接解题
          • Lv2:简化
          • LV3效率优化
      • 正交测试法
      • 装饰器
      • 综合面试题_原版
    • RF

  • 天眼查

  • 某米

  • 工作经历
  • 斗虫
  • 基础课件
wangyang
2023-09-02
目录

面试题-找众数

# 算法面试-找众数

# 前提:

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

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

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

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

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

示例:

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

预期输出: 5

# LV1:直接解题

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

def func(num:list):     #定义一个函数,接收"列表"数据
    res = []            #定义一个变量接收结果
1
2

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

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

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

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

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

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

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

[5, 5, 5, 5]

所以在加一部去重复数据

return set(res)
1

结果:

image-20210107140517783

# 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    #则加入结果
1
2
3
4
5
6
7

效果如下:

image-20210107141605630

# LV3效率优化

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

image-20210107142056236

这个测试数据中有5w+个元素,计算非常巨大

image-20210107142119665

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

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

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

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

如果是奇数

# 数组的元素数量是奇数
l = [1,1,3,3,3]
print(len(l) // 2)可以使用"整除"得到中点
# 这时恰好取到数组的中点,那么取到的一定是众数
1
2
3
4

如果是偶数

# 数组的元素数是偶数
 l = [1,1,3,3,3,3]
 print(len(l) // 2)
# 取到的是绝对中点向后取整,此案例使4/7
# 此时的众数也一定是>7/2,即至少出现4次
# 所以l[len(2//l)]一定是众数
1
2
3
4
5
6

重写:

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

效果如图:

image-20210107143048684

结论:速度比起直接解法,快了20倍以上

#python自动化#自动化入门
上次更新: 2023/09/05, 02:16:11
面试题-栈结构
正交测试法

← 面试题-栈结构 正交测试法→

最近更新
01
30.快速实现接口重构测试---deepdiff库使用
09-21
02
概述
09-07
03
概述
09-07
更多文章>
Theme by Vdoing | Copyright © 2018-2025 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式