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

Python实战社群

Java实战社群

长按识别下方二维码,按需求添加

扫码关注添加客服

进Python社群▲

扫码关注添加客服

进Java社群

作者丨王翔丨

来源丨清风Python(ID:BreezePython)


晚上翻手机,看见一道网友发的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.0100003000013000
1.4.010000400010400
2.1.020000100020100

最终代码

# -*- 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,并返回-1,这样当最终排序后,将切片的排序结果返回,就达到了预期的目的。

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

程序员专栏 扫码关注填加客服 长按识别下方二维码进群


近期精彩内容推荐:  

 外包程序员入职蚂蚁金服被质疑,网友:人生污点

 11 月全国程序员平均工资出炉

 弃用 Notepad++,还有 5 款更牛逼的选择!

 福利!手把手教你Python爬取女神套图


在看点这里好文分享给更多人↓↓

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值