机试练习总结

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

备考机试,开始时间20230116,持续更新。。。


一、简单

day001-20230116

1. 字符串逆序的两种实现方式:[::-1]和''.join(reversed())方法

        注意:reversed 函数返回一个反转的迭代器

2. 去除字符串中的空格:replace主要用于字符串的替换replace(old, new, count)

        注意:列表没有replace()和find()

3. 判断字符串是否为纯数字str1.isdigit()

4. 查找字符串中某字符的下标str1.index(''),列表不可用find() 'list' object has no attribute 'find'

index() 包含字符串则返回开始的索引值,否则抛出异常
find() 包含字符串则返回开始的索引值,否则返回-1

5. pycham运行的时候taceback的顺序,logging的顺序和代码顺序会混乱

6. eval()函数将参数中的字符串作为表达式来执行,返回表达式的值

7. 创建二维空列表 dp = [[] for i in range(3)]

day002-20230117

8. 求二位列表中的最大值max(map(max, lst))

9. 进制转换

十进制转换二进制:bin(10) -> str : 0b1010

十进制转换八进制:oct(10) -> str : 0o12

十进制转换十六进制:hex(10) -> str : 0xa

二进制转换十进制:int('0b1010', 2) -> int : 10

八进制转换十进制:int('0o12', 8) -> int : 10

十六进制转换十进制:int('0xa', 16) -> int : 10

注意:int()中的第一个参数为字符串类型

10. 字符串的split()函数使用注意:
  a.     如果被分割字符串的内容与分割符一致,则结果为长度为 2,元素为空字符串的列表,即  '#'.split('#') -> ['', '']
  b.     split() 多个空格当成一个空格,如果包含'\n','\t'也会被分割
          split(' ') 多个空格都要分割,每个空格分割出来空''
          例如:
          print(' h i'.split())     # ['h', 'i']
          print(' h i'.split(' '))     #['', 'h', 'i']

11. sort 与 sorted 区别:
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

关于参数 

list.sort( key=None, reverse=False)  
sorted(iterable, cmp=None, key=None, reverse=False)

key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)。
cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。

day003-20230118

12. ASCII码表: (1)0-9的ASCII值是48-57; (2)a-z的ASCII值是97-122; (3)A-Z的ASCII值是65-90

ASCII转字符用chr()方法,参数可以是10进制或2进制、8进制、16进制的数值类型

字符转ASCII用ord()方法,参数是字符串类型

13. 关于等差数列:末项 = 首相 + 公差 *(项数 - 1)

等差数列求和:Sn=n*a1+n(n-1)d/2或Sn=n(a1+an)/2

14. 字符串函数

string.isalpha() 如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False
string.isdigit() 如果 string 只包含数字则返回 True 否则返回 False
string.isspace() 如果 string 中只包含空格,则返回 True,否则返回 False
string.lower() 将字符串的大写字母转换为小写字母
string.upper() 将字符串的小写字母转换为大写字母
string.capitalize() 将字符串的首字母变成大写,其余小写
string.title() 字符串中每个单词的首字母大写,其余小写【'1hello world'.title结果为'1Hello world'】
string.swapcase() 大小写互换

15. 求绝对值内置函数abs()和math.fabs()

abs()是内置函数,fabs()在math模块中定义
abs()接收整型、浮点型、复数作为参数,fabs()只接收整型、浮点型,复数会报错
abs()返回float和int类型,math.fabs()返回float类型

16. 打印异常信息:print(traceback.format_exc())

17. python中实例化一个类用 s = Solution() 注意没有new关键字

day004-20230119

18. 使用取余符号有可能得到负数,所以一般写成:(a%b+b)%b
取余满足分配率:(a+b)%c=(a%c+b%c)%c  (a*b)%c=(a%c*b%c)%c

19. 约瑟夫环问题 -> 圆圈中最后剩下的数字思路:

day005-20230120

20. round()函数采用四舍六入五成双的计数保留法:
对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”,这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:
(1)5前为奇数,舍5入1;
(2)5前为偶数,舍5不进(0是偶数)。

21. python中的无穷大:负无穷:float('-inf') 正无穷:float('inf')

22. reverse()和reversed()
list.reverse() 该方法没有返回值,但是会对列表的元素进行反向排序。
reversed(seq) seq -- 要转换的序列,可以是 tuple, string, list 或 range。返回一个反转的迭代器。

23. all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。元素除了是 0、空、None、False 外都算 True。

【all('') 结果为True】

day006-20230124

24. 将两个列表中对应的元素组成元组可以使用:

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
我们可以使用 list() 转换来输出列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

print(list(map(lambda x, y: (x,y), se1, se2)))

enumerate(sequence, [start=0]) 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。返回 enumerate(枚举) 对象。list(enumerate(seq))的输出结果为[(0, 'a'), (1, 'b'), (2, 'c')]

print([(p1, p2) for idx1, p1 in enumerate(se1) for id2, p2 in enumerate(se2) if idx1 == id2])

map(function, iterable, ...) map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

print(list(map(lambda x, y: (x,y), se1, se2)))

day007-20230125

25. Python3二分查找库函数bisect(), bisect_left()和bisect_right()介绍_YMWM_的博客-优快云博客_bisect_left

day008-20230126

26. 向上向下取整

math.ceil( x ) 函数返回返回一个大于或等于 x 的的最小整数。
math.floor( x ) 返回小于或等于 x 的最大整数。

27. 切片&range()

先确定start(闭)、end(开),step代表方向(通常与start-end的正负一致,否则返回空)
要注意切片中的start、end使用-1代表最后一个元素,range()中的start、end使用-1代表数字-1

28. python默认递归深度为1000,超过会抛出异常RecursionError: maximum recursion depth exceeded,此时需要设置sys.setrecursionlimit(100000)

29. python模块分析之typing(三) - 倥偬时光 - 博客园

30. python的深拷贝与浅拷贝

浅拷贝:new = copy.copy(old)
将原对象拷贝到一个新的地址,新对象中的可变元素是原对象中可变元素的引用,原对象中的可变元素发生变化的话,新对象也会随之改变
深拷贝:new = copy.deepcopy(old)
将原对象及其可变元素递归拷贝到一个新的地址,原对象中的可变元素发生改变,新对象不会随之改变

31. 成员谓词in用于字典对象时, 判断的是key in dict

32. 对于有重复元素的序列进行二分查找法,找元素的第一个和最后一个下标

# 跳出循环后,l为target在数组中的第一个下标
l = 0
r = len(nums)  -1
while l <= r:
    m  =(l+r) // 2
    if target  <= nums[m] :
        r  = m-1
    else:
        l = m+1
res.append(l)
# 跳出循环后,l-1为target在数组中的最后一个下标
l = 0
r = len(nums) - 1
while l <= r:
    m = (l + r) // 2
    if target >= nums[m]:
        l = m + 1
    else:
        r = m - 1
res.append(l)

33. 使用dfs进行搜索时,相同元素不同顺序代表不同结果的,使用used数组,相同元素不同顺序代表重复结果的,使用start变量

二、分题型练习

1. 链表

1. 链表的反转

链表的遍历通常使用while循环
链表的反转包括2步:1. 原先头节点变尾节点,所以next = None 2. 其他所有节点的next指向前一个元素

//方法一:遍历
class Solution:
    def ReverseList(self , head: ListNode) -> ListNode:
        #处理空链表
        if not head:
            return None
        cur = head
        pre = None
        while cur:
            #断开链表,要记录后续一个
            temp = cur.next 
            #当前的next指向前一个
            cur.next = pre
            #前一个更新为当前
            pre = cur 
            #当前更新为刚刚记录的后一个
            cur = temp
        return pre

//方法二:递归
class Solution:
    def ReverseList(self , head: ListNode) -> ListNode:
        # write code here
        if head == None or head.next ==None:
            return head
        newHead = self.ReverseList(head.next)
        head.next.next = head
        head.next = None
        return newHead

2. 链表的结点顺序改变时,可能涉及到等号两边同时出现.next的情况,例如:xxx.next = yyy.next,此时,等号左边的next代表指向,等号右边的next代表节点,通常理解为xxx的下一个节点为yyy.next

3. 下面代码第3行和第4行的顺序不可改变,否则会报错,pre.next需要先把自己的值赋给temp.next,再接收新的值temp,如果改变顺序,则pre.next和temp.next的值都为temp

temp = cur.next
cur.next = temp.next
temp.next = pre.next
pre.next = temp

day009-20230127

4. 

2. 二分查找

1. 二维数组中的二分查找思路:

由于行列递增,可以得出:
a.在一列中的某个数字,其上的数字都比它小
b.在一行中的某个数字,其右的数字都比它大
搜索流程:
a.首先从数组左下角搜索.
b.如果当前数字大于target,那么查找往上移一位,如果当前数字小于target,那么查找往右移一位。
c.查找到target,返回true; 如果越界,返回false;

2. 寻找峰值可以使用二分查找,原则是顺着上坡找,

nums[mid]>nums[mid+1]时,右边是下坡,左边是上坡,此时right=mid;
nums[mid]<nums[mid+1]时,右边是上坡,左边是下坡,此时left=mid+1

3. 堆/栈/队列

1. 使用2个栈实现一个队列的思路

栈a用来实现入栈,栈b用来实现出栈。出栈时,若栈b为空,则将栈a中元素逆序添加到栈b中,栈a置空,然后从栈b弹出栈顶元素,实现出栈

2. 创建队列对象需要导入模块 from queue import Queue,常用的方法有:
元素入队:q.put()
获取队首元素:q.get()
输出队列中元素:while not q.empty():print(q.get()),如果while q 的话程序会无法终止

3. 

4. 递归/回溯

1. 

5.

6.

2.


总结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值