期末考试结束,迎来的是等待成绩的煎熬(不知道会不会被赶超导致无法去到已经联系好的学校呜呜呜)很久之前就想刷刷基础题,毕竟忘的和记的内容都已是陈年往事,最近终于有时间慢慢来啦!最近很喜欢用python写代码,所以文章里面涉及到的内容都是关于python的。
题目链接(LeetCode)
深浅拷贝
浅拷贝有三种形式
1.切片操作
lst1=lst2[::-1]
2.工厂函数
lst1=list(lst2)
3. copy函数
lst1=copy.copy(lst2)
浅拷贝只拷贝了最外面一层,内部的元素都只是拷贝了引用。
以添加元素这个操作为例:
外层添加元素时,浅拷贝不会随原列表变化而变化,在内层添加元素时,浅拷贝才会发生变化。
内层当中:
(1)对于不可变对象(字符串,元组,数值类型)因为值改变相当于复制返回一份新的地址,所以对于拷贝的对象不会随着原列表的改变而改变。
a = [1, 2, (3, 4)]
b = copy.copy(a)
a[-1] += (5, )
#改变不可变对象
print(a)
# [1, 2, (3, 4, 5)]
print(b)
# [1, 2, (3, 4)]
(2)对于可变对象(列表,字典,集合)因为值改变地址随着改变,所以对于拷贝的对象随着原列表的改变而改变。
a = [1, 2, [3, 4]]
b = copy.copy(a)
a[-1] += (5)
#改变不可变对象
print(a)
# [1, 2, [3,4,5]]
print(b)
# [1, 2, [3,4,5]]
深拷贝:重新分配一个内存空间,将原对象中的所有元素通过递归的方式进行拷贝到新对象中。
#只有一种形式
b=copy.deepcopy(a)
collections.Counter
'''
题目要求:
给你一个整数数组 arr 和一个整数 k 。现需要从数组中恰好移除 k 个元素,请找出移除后数组中不同整数的最少数目。
这里首先要确定每个元素的个数,collection.Counter很好的做到了这一点
输入:[4,3,1,1,3,3,2]
'''
def findLeastNumOfUniqueInts(self, arr, k):
"""
:type arr: List[int]
:type k: int
:rtype: int
"""
freq=collections.Counter(arr).most_common()[::-1]
#按照最常见出现的顺序排序,这里因为指定步数-1所以是升序
print(freq)
#[(4, 1), (2, 1), (1, 2), (3, 3)]
字符串没有remove()方法
magazine=magazine.replace(ransomNote[i],'-',1)
#使用replace进行替换
链表的中间节点
'''
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
第一种方法:链表转列表
'''
def middleNode(self, head: ListNode) -> ListNode:
A = [head]
print(A[0])
while A[-1].next:
A.append(A[-1].next)
return A[len(A) // 2]
'''
第二种方法:快慢指针
因为根据快指针前进的条件不同,对于奇数个元素获取到的位置也是不同的
fast.next!=null && fast.next.next != null时:获取到的是奇数个列表的中间第一个节点
fast!=null && fast.next != null时:获取到的是奇数个列表的中间第二个节点
下面的代码是获得奇数个列表的中间第二个节点的代码
'''
def middleNode(self, head: ListNode) -> ListNode:
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
位运算
使用位运算可以判断奇偶数!我怎么今天才知道!
只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。
num&1==0#num为偶数
num&1==1#num为奇数
#当然也可以使用其他位运算符啦
还有就是左移和右移的功能
num>>=1#右移一位,相当于除2
num<<=1#左移一位,相当于乘2