python面试题 算法排序

手写:已知一个长度n的无序列表,元素均是数字,要求把所有间隔为d的组合找出来,你写的解法算法复杂度多少;

def func(x, d):
    L = []
    n = len(x)
    if n < d:
        return None
    a = d 
    while a < n:
         r = []
         r.append(x[a-d])
         r.append(x[a])
        L.append(r)
        a = a + 1
    return L
list1 = [x for x in range(100)]
print(func(list1, 10))

手写:用一行python写出1+2+3+…+10**8 ;

print(sum([x for x in range(1, 10**8+1)]))
#或者
from functools import reduce
print(reduce(lambda x, y : x + y, [x for x in range(1, 10**8+1)]))

手写python:用递归的方式判断字符串是否为回文;

def isHuiWen(string):
    if len(string) < 2:
        return True
    if string[0] != string[-1]:
        return False
    return isHuiWen(string[1:-1])
string = input('请输入一个字符串')
if isHuiWen(string):
    print('回文')
else:
    print('非回文')

手写:一个长度n的无序数字元素列表,如何求中位数,如何尽快的估算中位数,

def centre(list1):
    if len(list1) <= 1:
        return list1
    list1.sort()
    n = len(list1) % 2
    m = len(list1) // 2
    if n == 0:
        return (list1[m] + list1[m-1])/2
    return list1[m]
list1 = [1,3,2,5,4]
print(centre(list1))

二分查找

"""
1. 二分查找是有条件的,首先是有序,其次因为二分查找操作的是下标,所以要求是顺序表
2. 最优时间复杂度:O(1)
3. 最坏时间复杂度:O(logn)
"""
list1 = [1, 2, 3, 4, 5, 6, 7]

# 递归二分查找
def select(lis, data):
    n = len(lis)
    if n < 1:
        return False
    mid = n // 2
    if lis[mid] > data:
        return select(lis[0:mid], data)
    elif lis[mid] < data:
        return select(lis[mid+1:], data)
    else:
        return True
print(select(list1, 6))

# 非递归二分查找
def select(lis, data):
    n = len(lis)
    first = 0
    last = n - 1
    while first <= last:
        mid = (first + last) // 2
        if lis[mid] > data:
            last = mid - 1
        elif lis[mid] > data:
            first = mid + 1
        else:
            return True
return False
print(select(list1, 3))
关于递归中return分到None,按照错误写法来介绍,因为return的string实际上是return上一次递归的结果,但是上一次递归并没有返回值,所以是None
题目:一个随机的字符串,删除所有的ac和b,例如aacbca -> a
# 错误写法
def test(string):
    if 'ac' in string:
        test(string.replace('ac', ''))
    elif 'b' in string:
        test(string.replace('b', ''))
    else:
        return string
# 正确写法
def test(string):
    if 'ac' in string:
        return test(string.replace('ac', ''))
    elif 'b' in string:
        return test(string.replace('b', ''))
    else:
        return string
判断A和B相似,所有数字出现的次数一样即相似。例如:123123和132312相似。
def is_like(A, B):
    a_n = len(A)
    b_n = len(B)
    if a_n != b_n:
        return False
    for a in A:
        if A.count(a) != B.count(a):
        return False
    return True

你可能感兴趣的:(python面试题 算法排序)