python面试题1


1.冒泡排序

https://www.cnblogs.com/bigdata-stone/p/10464243.html

'''冒泡排序'''
# coding:utf-8
lis = [1, 13, 5, 35, 6, 9, 10]
s = range(len(lis))[::-1] 
print(s)
for i in s:               #确定排序几次,第一次把7个数最大派最后,第二次剩下6个最大排最后,总共需要6次排序
    for j in range(i):    #确定比较次数,第一次7个数字需要比较6次,第二次剩下6个需要比较5次
        if lis[j] > lis[j +1 ]:
            lis[j], lis[j + 1] = lis[j + 1], lis[j]
print(list)
for i in range(len(lis) - 1):
    for j in range(len(lis) - i - 1):
        print(j)
        if lis[j] > lis[j + 1]:
            lis[j], lis[j + 1] = lis[j + 1], lis[j]

2.列表分组

https://www.cnblogs.com/yitao326/p/12515678.html

从大到小打印元素个数
l = [1, 2, 3, 'a', 'b', 'c', 1, 2, 'a', 'b', 3, 'c', 'd', 'a', 'b', 1]
s = set(l)
new_l = [(i, l.count(i)) for i in s]
new_l.sort(key=lambda x: x[1], reverse=True)
print(new_l)

3.海量数据top k

import random


def gen_num(n):
    for i in range(n):
        yield random.randint(0, n)


g = gen_num(1000)
print(list(set(g))[-10:])

4.两数之和

l = [1, 2, 3, 4, 5, 6, 7, 8]
target = 6
for i in l:
    for j in l:
        if i < j and i + j == target:
            print(l.index(i), l.index(j))
l = [1,2,3,4,5,6,7,8]
set1 = set(list1)   # 使用集合已方便查找
target = 6

result = []
for a in list1:
    b = target - a
    if a < b < target and b in set1:   # 在集合中查找,为避免重复,判断a为较小的那个值
        result.append((list1.index(a), list1.index(b)))   # 列表index取下标的操作为O(1)
print(result)

递归问题

1.阶乘

def factorial(n):
    if n == 1:  # 出口
        return 1
    return factorial(n-1) * n   # 自我调用求上一个结果,然后推导本层结果

2.斐波那切数列

def fib(n):
    if n <= 2:
        return 1
    return fib(n - 1) + fib(n - 2)

3.跳台阶,疯狂跳台阶

  • 跳台阶:一只青蛙,一次可以跳上1阶,也可以跳上2阶,问跳上n阶有多少种跳法。

  • 变态跳台阶:一只青蛙,一次可以跳上1阶,可以一次跳上n阶,为跳上n阶有多少种跳法

 跳台阶  

jump1 = lambda n: n if n<=2 else jump1(n-2) + jump1(n-1)

变态跳台阶

jump2 = lambda n: n if n<=2 else jump2(n-1) * 2

4.快速排序

快速排序的是想是选一个基准数(如第一个数),将大于该数和小于该数的分成两块,然后在每一块中重复执行此操作,直到该块中只有一个数,即为有序。

  • 出口:列表长度为1(<2)时,返回列表

  • 选择一个数,(将小于该数的序列)排序结果  +  基准数 + (大于该数的序列)排序结果

def quick_sort(l):
    if len(l) < 2:
        return l
    index = 0
    low_part = [i for i in l if i < l[index]]
    equel_part = [i for i in l if i == l[index]]
    high_part = [i for i in l if i > l[index]]
    return quick_sort(low_part) + quick_sort(equel_part) + quick_sort(high_part)

 其他

1.判断是否闭合

def is_closed(text):
    stack = []  # 使用list模拟栈, stack.append()入栈, stack.pop()出栈并获取栈顶元素
    brackets = {')':'(',']':'[','}':'{'}  # 使用字典存储括号的对应关系, 使用反括号作key方便查询对应的括号
    for char in text:
        if char in brackets.values():   # 如果是正括号,入栈
            stack.append(char)
        elif char in brackets.keys():  # 如果是反括号
            if brackets[char] != stack.pop():  # 如果不匹配弹出的栈顶元素
                return False
    if len(stack) != 0:
        return False
    return True

2.合并2个有序列表,并保持有序

list1 = [1, 5, 7, 9]
list2 = [2, 3, 4, 5, 6, 8, 10, 12, 14]
new_l = []
for i in range(len(list1) + len(list2)):
    if list1 and not list2:
        new_l.append(list1.pop())
    elif list2 and not list1:
        new_l.append(list2.pop())
    else:
        new_l.append(list1.pop()) if list1[-1] > list2[-1] else new_l.append(list2.pop())
new_l.reverse()
print(new_l)

相关