一道简单的Python面试题,却涵盖诸多考点,快来试试吧!

简介: 一道简单的Python面试题,却涵盖诸多考点,快来试试吧!

晚上翻手机,看见一道网友发的python面试题求助帖,当时简单扫一眼就跳过了,但下来仔细想想觉得还蛮有趣,开电脑梳理下思路,因为没有官方答案,所以大家可以一起来做做,其中涉及的python知识点还是蛮多的。


题目内容

一个标准的版本需要涵盖,大版本.小版本.补丁版,各版本之间使用英文点符号分隔,且每个版本取值范围均为0~99。

现有一批产品版本号列表,需要过滤掉不符合要求的内容后,将版本号通过sorted进行升序排列。


题目分析


初看此题,给人的感觉有些好笑,居然要告诉大家使用sorted进行排序,难道是生怕谁不知道这个函数吗?

但当随便验证两个用例发现,sorted的默认排序存在BUG。

sorted(['1.3.0','1.1.0','1.2.0'])
>>> ['1.1.0', '1.2.0', '1.3.0']
# 错误的默认排序
sorted(['1.30.0','1.4.0','1.2.0'])
>>> ['1.2.0', '1.30.0', '1.4.0']

直接使用字符串进行排序,默认是按位对比每个版本号,然后进行排序,这导致了1.30.0 < 1.4.0的BUG。

仔细想想,面试官想考察的应该是sorted的自定义排序方法。那么该如何正确的比较所有版本号,又能同时过滤掉错误的版本号呢?


过滤版本号


考虑到版本号的特殊性,最简单的过滤方法,必然是正则了:

import re
pattern = re.compile(r'^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}')
    if not pattern.match(version):
        raise ValueError("error version [%s],the version type must be [xx.xx.xx]" % version)

当然这里是我们验证的操作方式,排序时当然不能抛出异常了。


版本号比较


既然每个版本号的取值范围在0-99之间,那么熟悉数学的我们,是否有了思路?我们按照百进制的方式,来统计版本号,不就能轻易的达到目的么?就拿刚才的1.30.0和1.4.0来举例如下:

版本号 大版本(10000) 小版本(100) 补丁版本(1) 总计
1.30.0 10000 3000 0 13000
1.4.0 10000 400 0 10400
2.1.0 20000 100 0 20100


最终代码


# -*- coding: utf-8 -*-
# @微信号   : King_Uranus
# @公众号    : 清风Python
# @GitHub   : https://github.com/BreezePython
# @Date     : 2020/11/04 22:48:33
# @Software : PyCharm
# @version  :Python 3.7.8
# @File     : compare_version.py
import re
class CompareVersion:
    def __init__(self, version_list):
        self.versions = version_list
        self.error_version_num = 0
    def com_version(self, version):
        sum_version = 0
        version_weights = [10000, 100, 1]
        pattern = re.compile(r'^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}')
        if not pattern.match(version):
            self.error_version_num += 1
            return -1
        version_list = version.split('.')
        for index, small_version in enumerate(version_list):
            sum_version += version_weights[index] * int(small_version)
        return sum_version
    def sort_version(self):
        sorted_version = sorted(self.versions, key=lambda x: self.com_version(x))
        return sorted_version[self.error_version_num:]
if __name__ == '__main__':
    versions = ['0.0.0', '99.99.99', '100.0.1', '1.0.-1', '1.1.99',
                '2.10.1', '2.9.10', '999', '10-0.1']
    main_class = CompareVersion(versions)
    print(main_class.sort_version())
output:
['0.0.0', '1.1.99', '2.9.10', '2.10.1', '99.99.99']

在sorted遍历过程中,每当发现一个错误版本号,我们就将error_version_num加一,并返回-1,这样当最终排序后,将切片的排序结果返回,就达到了最终的目的。

当然了,这只是我一时兴起的抛砖引玉答案,期待大家给出更好的作答。


The End




相关文章
|
1月前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
81 2
|
1月前
|
Java 程序员
面试高频考点!关于构造方法的那些事儿
本文介绍了Java中的构造方法,包括其基本概念、默认构造方法、构造方法的重载、构造方法的细节以及执行顺序。通过具体示例,详细解释了构造方法在对象初始化中的重要作用,帮助读者在面试中更好地应对相关问题。
28 1
|
2月前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
2月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
37 3
|
2月前
|
Java C++ Python
【面试宝典】深入Python高级:直戳痛点的题目演示(下)
【面试宝典】深入Python高级:直戳痛点的题目演示(下)
|
2月前
|
设计模式 Unix Python
【面试宝典】深入Python高级:直戳痛点的题目演示(上)
【面试宝典】深入Python高级:直戳痛点的题目演示(上)
|
5月前
|
数据采集 机器学习/深度学习 数据可视化
了解数据科学面试中的Python数据分析重点,包括Pandas(DataFrame)、NumPy(ndarray)和Matplotlib(图表绘制)。
【7月更文挑战第5天】了解数据科学面试中的Python数据分析重点,包括Pandas(DataFrame)、NumPy(ndarray)和Matplotlib(图表绘制)。数据预处理涉及缺失值(dropna(), fillna())和异常值处理。使用describe()进行统计分析,通过Matplotlib和Seaborn绘图。回归和分类分析用到Scikit-learn,如LinearRegression和RandomForestClassifier。
106 3
|
6月前
|
开发框架 Python
Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。
【6月更文挑战第21天】Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。要开始,先通过`pip install pygame`安装。基本流程包括:初始化窗口、处理事件循环、添加游戏元素(如玩家和敌人)、响应用户输入、更新游戏状态及结束条件。随着项目发展,可逐步增加复杂性。
160 1
|
5月前
|
Python
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
|
5月前
|
存储 算法 索引
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题