时间复杂度、空间复杂度、常用算法题

时间复杂度
https://blog.csdn.net/sexgeek/article/details/53729226
https://www.cnblogs.com/cfas/p/14304810.html
1、常数阶O(1)
无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1)
2、对数阶O(logN)
3、线性阶O(n)
一个循环是O(n),2个循环嵌套O(n^2),3个循环嵌套O(n^3),以此类推

空间复杂度
https://zhuanlan.zhihu.com/p/62554831
1、算法中临时变量的个数与问题规则n无关,空间复杂度为O(1)
2、递归和线性空间都是O(n)

做牛客网题目的时候发现不少奇奇怪怪的用法:

print(ord("a"))  # ascii嘛
print(chr(ord("a") + 1))  # 转到下一位字母
print("123".isdigit())  # 如果字符串只包含数字则返回 True 否则返回 False
print("ddd".isalpha())  # 如果字符串只包含字母则返回 True 否则返回 False

print(''.join(reversed("123")))  # 反转,reversed返回是一个迭代对象
print(list(reversed([1, 2, 3])))

print(sorted([3, 6, 2, 4], reverse=False))  # 排序,reverse默认是false,升序排列
a = [{"name": "Taobao", "age": 100}, {"name": "Runoob", "age": 7},
     {"name": "Google", "age": 100}, {"name": "Wiki", "age": 200}]
print(sorted(a, key=lambda i: i['name'], reverse=False))  # key是指排序规则,这里的i是a下面每个字典

print(" sdsdkksdsew a".strip('a'))  # 移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
print([1, 2, 4, 5].pop(1))  # pop默认删除最后一位,可以删除指定位置

print(bin(15))  # 10进制转换为2进制
print(int("0xAA", base=16))  # 16进制转换为10进制(其他进制转化为10进制)

 

1、冒泡排序和快速排序

def maopaopaixu(a):
    for i in range(len(a) - 1):  # 这个循环负责设置冒泡排序进行的次数
        # 第一次排就能把最大的排到最后面,最后一个就不参与排序了
        # 第二次排需要的次数-1,能把第二大的排到倒数第二,倒数第二个就不参与排序了
        # 同理第三次、第四次
        for j in range(len(a) - i - 1):  # j为列表下标
            if a[j] > a[j + 1]:
                a[j], a[j + 1] = a[j + 1], a[j]
    return a


def quick_sort(data):
    """快速排序"""
    if len(data) >= 2:  # 递归入口及出口
        mid = data[len(data) // 2]  # 选取基准值,也可以选取第一个或最后一个元素(//取整除 - 返回商的整数部分(向下取整))
        left, right = [], []  # 定义基准值左右两侧的列表
        data.remove(mid)  # 从原始数组中移除基准值,如果不移除,list含有相同元素时则会陷入无限递归
        for num in data:
            if num >= mid:
                right.append(num)
            else:
                left.append(num)
        return quick_sort(left) + [mid] + quick_sort(right)
        # return quick_sort(left) + quick_sort(right)
    else:
        return data


if __name__ == '__main__':
    a = [2, 1, 4, 5, 10, 11, 21, 34, 6, 6]
    print(maopaopaixu(a))
    print(quick_sort(a))

2、阶乘

def funa(a: int):
    if a < 1:
        print("数据错误")
        return
    if a == 1:
        return 1
    if a > 1:
        return a * funa(a - 1)


def funb(a: int):
    l = 1
    for i in range(1, a + 1):
        l = l * i
    return l


if __name__ == '__main__':
    print(funa(6))
    print(funb(6))

3、反转

def fanzhuan1(a):
    if isinstance(a, str):
        l = ''
        for i in range(len(a)):
            l = l + a[-(i + 1)]
        return l
    if isinstance(a, list):
        l = []
        for i in range(len(a)):
            l.append(a[-(i + 1)])
        return l


def fanzhuan2(a):
    return a[::-1]


if __name__ == '__main__':
    a = "ksjdkjsd"
    print(fanzhuan1(a))
    print(fanzhuan2(a))
    a = [1, 2, 3, 4, 5]
    print(fanzhuan1(a))
    print(fanzhuan2(a))

4、数组移除元素,remove会删掉元素,导致后面的元素下标前移,实际上5和-6没有参与循环

def dellist1(a: list):
    for i in a:
        if i < 0:
            a.remove(i)
    return a


def dellist2(a: list):
    return [i for i in a if i > 0]


if __name__ == '__main__':
    a = [1, 3, -3, 5, -4, -6, 10]
    print(dellist1(a))  # [1, 3, 5, -6, 10]
    print(dellist2(a))  # [1, 3, 5, 10]

5、字符串统计

str001 = "my love is you do you konw it ? do you love me ?"
list001 = str001.split(' ')
print(list001)
print(str001.count(' '))
print("单词的总数为%s" % (len(list001)))  # 14
print("空格的总数为%s" % str001.count(' '))  # 13
print("you的总数为%s" % (list001.count('you')))  # 3

 6、斐波拉契数列

# 一般来说这个数列的入参是len
# 0、1、1、2、3、5、8、13、21、34
def feb(len: int):
    l = [0, 1]
    if len < 2:
        l = [0, 1]
    for i in range(len - 2):
        l.append(l[-1] + l[-2])
    return l


def feb2(a):
    """这个只能取单个"""
    if a == 2:
        return 1
    if a == 1:
        return 0
    else:
        return feb2(a - 1) + feb2(a - 2)


if __name__ == '__main__':
    print(feb(6))
    print(feb2(6))

 7、去重

def mydemo(a):
    for i in a:
        len = a.count(i)
        while len > 1:
            a.remove(i)
            len = a.count(i)
    return a


def setdemo(a):
    if isinstance(a, str):
        return ''.join(set(b))
    if isinstance(a, list):
        return list(set(a))
    if isinstance(a, tuple):
        return tuple(set(a))


if __name__ == '__main__':
    a = [1, 2, 3, 1, 4, 6, 7, 3, 2]
    b = 'sjhdkshdksssd'
    c = (1, 2, 3, 1, 4, 6, 7, 3, 2)
    print(mydemo(a))
    print(setdemo(a))
    print(setdemo(b))
    print(setdemo(c))

 8、求质数,美团视频面试第一道题,就挂了,是我自己想的太简单

# c=0
# for i in range(101,201):
#     d = 0
#     for j in range(2,i):
#         if i%j==0:
#             d+=1
#             break
#     if d==0:
#         c=c+1
# 
# print(c)


c=0
for i in range(101,201):
    for j in range(2,i):
        if i%j==0:  # 如果符合条件,i就不是质数。跳出循环,不执行else
            break
    else:  # 如果for能正常执行完,说明i是质数,执行else
        c=c+1

print(c)

 for  else语句:当 for 所有的语句代码块正常运行完,才会运行 else 语句

posted @ 2021-03-14 15:50  whitewall  阅读(236)  评论(0)    收藏  举报