面试题-Python-002

1、 给出一个数组,如[7864,284,347,7732,8498],现在需要将数组中的数字拼接起来,如按顺序依次拼接为:786428434777328498,数组中的数字拼接顺序可以任意,编写程序,返回[最大的可能拼出的数字]。(以上面数组为例,返回:8498786477323472284)

方法一:

import time
startT = time.clock()

listA = [7864, 284, 347, 7732, 8498]
strB = ''
for i in range(len(listA)):
    for j in range(len(listA)-1):
        if listA[j] < listA[j+1]:
            listA[j], listA[j+1] = listA[j+1], listA[j]
for i in listA:
    strB = strB + str(i)
print(strB)

endT = time.clock()
print('耗时:{}'.format(endT - startT)) 

解析:1)实现倒序排序。
   2)字符串拼接。

拓展:除了冒泡排序,试试换个排序方法。

方法二:

import time
startT = time.clock()

listA = [7864, 284, 347, 7732, 8498]
strB = ''
while listA != []:
    maxA = listA[0]
    indexA = 0
    for j, a in enumerate(listA):
        if a > maxA:
            maxA = a
            indexA = j
    strB += str(maxA)
    listA.pop(indexA)

print(strB)

endT = time.clock()
print('耗时:{}'.format(endT - startT))

解析:1)每次找到数组中,当前最大的数,然后将该数拼接到待输出字符串中,并同时从原数组中移除该数。
   2)重复循环(1),直到原数组被移空。
   3)在获取最大数时,利用了enumerate函数同时获取下标、元素
   4)因为同时完成排序和字符串拼接,方法二比方法一有明显的效率提升。

2、 有一个文件,文件中每一行为一个 HTTP 请求响应的 log ,每行的 log 格式为:[HTTP URL] [请求响应码,如 200,404] [请求响应时间,以 ms 为单位]
  例如‘http://www.baidu.com 200 345’。求一下所有响应码为 200 的请求的响应时间平均值,单位 ms。

fpath = '*请改为log文件的绝对路径*'
irow = 0
ftime = 0
i = -1
with open(fpath, 'r') as f:
    for l in f.readlines():
        if l[:4].lower() != 'http':
            continue
        i = l.find(' 200 ')
        if i > -1:
            irow += 1
            ftime += int(l[i+4:])
print('状态为200的记录总共 {} 行,总耗时 {} ms,平均耗时 {:.4f} ms。'.format(irow, ftime, ftime / irow))

解析:1)按行读取记录。
   2)为了避免空行,只考虑http开头的行记录。
   3)因为url中通常不会有空行,而毫秒列后直接是换行符。所以这里取巧直接在 响应码200前后加上分隔字符 作为需要查询的字符串。虽然log文件中,我是用tab键做分隔,但这里查询时用空格也能匹配成功(我的环境上,tab总是被转换成空格,不知道是操作系统的原因,还是编辑器的原因)。但不保证windows系统下这样处理也能成功。
   4)响应码是200时,行计数器加1,时间计数器累加。

3、L = [1, 2, 3, 11, 2, 5, 3, 2, 5, 3],用一行代码得出 [11, 1, 2 ,3 ,5]。

L = [1, 2, 3, 11, 2, 5, 3, 2, 5, 3]
print(list(set(L)))

解析:1)本题考点是列表去掉重复元素。
   2)set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。又,set是无序的。关于set的详细说明见这里

4、L = [1, 2, 3, 5, 6],如何得出'12356'?

L = [1, 2, 3, 5, 6]
print(''.join(str(i) for i in L))

解析:1)这题最简单的写法就是用for循环遍历list,然后拼接字符串,但那样的话,需要写多行代码。
     这里通过巧妙利用join函数和生成器,可以用一行代码完成。
   2)join函数的说明见这里;生成器的详细说明见这里

原文地址:https://www.cnblogs.com/yjys/p/10738312.html