leetcode链接:添加链接描述
数的三种深度遍历、层次遍历:添加链接描述
# Definition for a binary tree node.法一,递归
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
res=[]
def helper(root):
if not root:
return
helper(root.left)
res.append(root.val)
helper(root.right)
helper(root)
return res
class Solution:#非递归,模拟指针
def inorderTraversal(self, root: TreeNode) -> List[int]:
res = []
stack = []
# 用p当做指针
p = root
while p or stack:
# 把左子树压入栈中
while p:
stack.append(p)
p = p.left
# 输出 栈顶元素
p = stack.pop()
res.append(p.val)
# 看右子树
p = p.right
return res
leetcode链接:添加链接描述
思路:
递归:就是依次输出根,左,右,递归下去
迭代:使用栈来完成,我们先将根节点放入栈中,然后将其弹出,依次将该弹出的节点的右节点,和左节点,**注意顺序,**是右,左,为什么?因为栈是先入后出的,我们要先输出左节点,所以让它先进栈.
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
res = []
if not root:#注意如果没有,输出空数组!!
return res
stack = [root]
while stack:
node = stack.pop()
res.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return res
leetcode链接:添加链接描述
思路:
递归:同理,顺序:左,右,根
迭代:这就很上面的先序一样,我们可以改变入栈的顺序,刚才先序是从右到左,我们这次从左到右,最后得到的结果取逆.
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
res=[]
if not root:#注意如果没有,输出空数组!!
return res
stack=[root]
while stack:
node=stack.pop()
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
res.append(node.val)
return res[::-1]
leetcode链接:添加链接描述
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
res,cur_level=[],[root]
while cur_level:
temp=[]
next_level=[]
for i in cur_level:
temp.append(i.val)
if i.left:
next_level.append(i.left)
if i.right:
next_level.append(i.right)
res.append(temp)
cur_level=next_level
return res
leetcode链接:添加链接描述
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
n1=len(word1)
n2=len(word2)
dp=[[0]*(n2+1) for i in range(n1+1)]
for i in range(n1+1):
dp[i][0]=i
for j in range(n2+1):
dp[0][j]=j
for i in range(1,n1+1):
for j in range(1,n2+1):
if word1[i-1]==word2[j-1]:
dp[i][j]=dp[i-1][j-1]
else:
dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1
return dp[-1][-1]
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
#法一:字符串切片
return s[n:]+s[:n]
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
#法二:列表遍历拼接
res=[]
for i in s[n:]:
res.append(i)
for i in s[:n]:
res.append(i)
return ''.join(res)
#利用取余可以简化操作
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
#法二:列表遍历拼接
res=[]
for i in range(n:n+len(s)):
res.append(s[i%len(s)])
return ''.join(res)
#方法三:字符串遍历拼接
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
res=''
for i in s[n:]:
res+=i
for i in s[:n]:
res+=i
return res
leetcode链接
题目坑点:字符串真实长度length和字符串不是一个长度,需要先切片。
(1)Python replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
replace()方法语法:str.replace(old, new[, max])
(2)join()方法语法:
str.join(sequence)
sequence – 要连接的元素序列
详细可学习:添加链接描述
str = "-";
seq = ("a", "b", "c"); # 字符串序列
print str.join( seq );
#以上实例输出结果如下:
a-b-c
class Solution:
def replaceSpaces(self, S: str, length: int) -> str:
s=S[:length]
return s.replace(' ','%20',length)
class Solution:
def replaceSpaces(self, S: str, length: int) -> str:
return '%20'.join(S[:length].split(' '))
class Solution:
def canPermutePalindrome(self, s: str) -> bool:
times=collections.Counter(s)
num=[d%2 for d in times.values()]
if num.count(1)>1:
return False
return True
class Solution:
def oneEditAway(self, first: str, second: str) -> bool:
if abs(len(first)-len(second))>1:
return False
count=0
if len(first)==len(second):
for i in range(len(first)):
if first[i]!=second[i]:
count+=1
if count>=2:
return False
return True
if len(first)<len(second):
first,second=second,first
if len(first)>len(second):
for i in range(len(first)):
if first[0:i]+first[i+1:]==second:
return True
return False
class Solution:
def compressString(self, S: str) -> str:
n=len(S)
res=''
i=0
while i<n:
j=i
while j<n and S[i]==S[j]:
j+=1
res+=S[i]+str(j-i)
i=j
if len(res)<len(S):
return res
else:
return S
#法一:空间和时间复杂度都是O(N^2)
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
n = len(matrix)
# Python 这里不能 matrix_new = matrix 或 matrix_new = matrix[:] 因为是引用拷贝
matrix_new = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n):
matrix_new[j][n - i - 1] = matrix[i][j]
# 不能写成 matrix = matrix_new
matrix[:] = matrix_new
#法二:时间复杂度是O(N^2),空间复杂度O(1)
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
n = len(matrix)
for i in range(n // 2):
for j in range((n + 1) // 2):
temp = matrix[i][j];
matrix[i][j] = matrix[n - j - 1][i];
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
matrix[j][n - i - 1] = temp
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
res=[]
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j]==0:
res.append(i)
res.append(j)
for i in range(len(res)):
if i%2==0:
for j in range(len(matrix[0])):
matrix[res[i]][j]=0
elif i%2==1:
for j in range(len(matrix)):
matrix[j][res[i]]=0
class Solution:
def isFlipedString(self, s1: str, s2: str) -> bool:
if len(s1)!=len(s2):
return False
if len(s1)==0 and len(s2)==0 :
return True
else:
for i in range(len(s1)):
if s1[i:]+s1[0:i]==s2:
return True
return False
class Solution:
def isFlipedString(self, s1: str, s2: str) -> bool:
return len(s1)==len(s2) and s1 in s2*2
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None 双指针
class Solution:
def removeDuplicateNodes(self, head: ListNode) -> ListNode:
if not (head and head.next):
return head
cur=head
res={
head.val}
while head.next:
if head.next.val in res:
head.next=head.next.next
else:
res.add(head.next.val)
head=head.next
return cur
相似题目:排序链表
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None 不占用额外空间 可利用上题的解法求解
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
node=head
while node and node.next:
if node.val==node.next.val:
node.next=node.next.next
else:
node=node.next
return head
#法一:暴力解法--切片
class Solution:
def longestPalindrome(self, s: str) -> str:
if s==s[::-1]:
return s
max_len=1
res=s[0]
for i in range(len(s)-1):
for j in range(i,len(s)):
if j-i+1>max_len and s[i:j+1]==s[i:j+1][::-1]:
max_len=j-i+1
res=s[i:j+1]
return res
class Solution:
def longestPalindrome(self, s: str) -> str:
# 马拉车算法
# 先在字符串中间加符号隔开,使得奇偶回文数的形式统一
# 然后用kmp的思想去优化中心扩散
if len(s)== 0:return ""
s_new = '#' + '#'.join(s) + '#'
#print(s_new)
#已遍历的最大右边界
mx = 0
#对应的中心点
mid = 0
l = len(s_new)
# 扩散半径数组,初始值1或者0都可以,只是代表刚开始的时候扩散半径是多少而已
p = [1]*l
for i in range(l):
if i<mx:
# 这个时候可以用已经计算过的值
# 不能超过已遍历的右边界
# i对应的镜像 = 2*mid - i
# 由mx定义可知半径最长不会超过mx-i
p[i] = min(mx-i,p[2*mid-i])
# 主要的优化已经在上面节省了时间,接下来就是正常的扩散
while( i-p[i]>=0 and i+p[i]<l and s_new[i-p[i]] == s_new[i+p[i]]):
p[i] += 1
# 记录一下mx和mid
if i+p[i] > mx:
mx = i+p[i]
mid = i
maxr = max(p)
ans = p.index(maxr)
# 因为跳出循环的时候多加了1,所以实际上的扩散半径应该减1
maxr -= 1
return s_new[ans-maxr:ans+maxr+1].replace('#',"")
#假设了从左到右位数越来越小,高位在左低位在右
class Solution:
def romanToInt(self, s: str) -> int:
romanint={
'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
n=len(s)
result=0
for i in range(n-1):
if romanint[s[i]]<romanint[s[i+1]]:
result-=romanint[s[i]]
else:
result +=romanint[s[i]]
return result+romanint[s[-1]]
原题链接
参考题解
zip学习
首先是对不定量参数*args,**kwargs传参进行简单的说明:
*args:用来发送一个非键值对的可变数量的参数列表给一个函数
**kwargs:是将不定长的键值对作为参数传递给一个函数
#法一:Python zip特性,取每一个单词的同一位置的字母,看是否相同。
#解题思路:先使用zip(*li)对字符串数组进行元素打包,然后使用set()函数去重,如果去重后的元素长度为1,则是公共前缀。
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
res=''
for tmp in zip(*strs):
tmp_set=set(tmp)
if len(tmp_set)==1:
res+=tmp[0]
else:
break
return res
#法三:按字典排序数组,比较第一个,和最后一个单词,有多少前缀相同。注意是排序后的数组
class Solution:
def longestCommonPrefix(self, s: List[str]) -> str:
if not s:
return ''
s.sort()
n=len(s)
a=s[0]
b=s[n-1]
res=''
for i in range(len(a)):
if i<len(b) and a[i]==b[i]:
res+=a[i]
else:
break
return res
class Solution:
def isValid(self, s: str) -> bool:
stack=[]
mapping={
')':'(','}':'{',']':'['}
for char in s:
if char in mapping:
top_element=stack.pop() if stack else'#' #注意只有一个字符的情况
if mapping[char]!=top_element:
return False
else:
stack.append(char)
return not stack
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None 法一:递归
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if not l1:
return l2
elif not l2:
return l1
elif l1.val<=l2.val:
l1.next=self.mergeTwoLists(l1.next,l2)
return l1
else:
l2.next=self.mergeTwoLists(l1,l2.next)
return l2
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
# 创建哑节点作为 结果链表 的开头
dummy = ListNode(0)
# 有个游标,标识 结果链表 的结尾
move = dummy
# l1 和 l2 都未遍历结束
while l1 and l2:
# 如果 l1 的数值比较小
if l1.val <= l2.val:
# 把 l1 头部节点拼接到 结果链表 的结尾
move.next = l1
# l1 指向下一个节点
l1 = l1.next
else:
# 把 l2 头部节点拼接到 结果链表 的结尾
move.next = l2
# l2 指向下一个节点
l2 = l2.next
# 移动 结果链表 的结尾指针
move = move.next
# l1 或者 l2 尚未使用完,拼接到 结果链表 的最后
move.next = l1 if l1 else l2
# 返回哑节点的下一个位置
return dummy.next
class Solution:
def titleToNumber(self, s: str) -> int:
tmp ={
'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7,'H':8,'I':9,'J':10,'K':11,'L':12,'M':13,'N':14,'O':15,'P':16,'Q':17,'R':18,'S':19,'T':20,'U':21,'V':22,'W':23,'X':24,'Y':25,'Z':26}
s=[i for i in s]
res=0
p=1
while s:
res+=tmp[s.pop()]*p
p=p*26
return res
class Solution:
def titleToNumber(self, s: str) -> int:
res=0
bit=1
for i in s[::-1]:
res+=(ord(i)-64)*bit
bit*=26
return res
#数值计算,注意限定范围约束
class Solution:
def reverse(self, x: int) -> int:
y,res=abs(x),0
# 则其数值范围为 [−2^31, 2^31 − 1]
boundry=(1<<31)-1 if x>0 else (1<<31)
while y!=0:
tmp=y%10
res=res*10+tmp
if res>boundry:
return 0
y//=10
return res if x>0 else -res
#字符串切片,注意限定范围约束
class Solution:
def reverse(self, x: int) -> int:
str_num=str(x)[::-1]
if str_num.endswith('-'):
str_num=str_num[-1]+str_num[:-1]
return int(str_num) if int(str_num)>=-2**31 else 0
return int(str_num) if int(str_num)<=2**31-1 else 0
# 方法一:字符串切片
class Solution:
def isPalindrome(self, x: int) -> bool:
x=str(x)
if x==x[::-1]:
return True
return False
# 方法二: 将int转化成str类型: 双指针 (指针的性能一直都挺高的),转字符串
# 复杂度: O(n)
class Solution:
def isPalindrome(self, x: int) -> bool:
x=str(x)
left,right=0,len(x)-1
while left<right:
if x[left]!=x[right]:
return False
left+=1
right-=1
return True
#取模运算
class Solution:
def isPalindrome(self, x: int) -> bool:
if x<0:
return False
res=0
old=x
while x:
tmp=res%10
res=res*10+tmp
x//=10
if res==old:
return True
return False
#旋转一半的数,约束条件 res<x,奇偶判断 return res==x or x==(res//10)
class Solution:
def isPalindrome(self, x: int) -> bool:
if x<0 or(x%10==0 and x!=0):
return False
res=0
while res<x:
tmp=x%10
res=res*10+tmp
x//=10
return res==x or x==(res//10)
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if not nums:
return 0
i=0
for j in range(1,len(nums)):
if nums[i]!=nums[j]:
i+=1#先i增加,再赋值
nums[i]=nums[j]
return i+1
添加链接描述
与26题相似
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
i=0
for j in range(0,len(nums)):
if nums[j]!=val:
nums[i]=nums[j]
i+=1
return i
#方法一:子串逐一比较 - 线性时间复杂度
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
h,n=len(haystack),len(needle)
for i in range(h-n+1):
if haystack[i:i+n]==needle:
return i
return -1
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
n=len(nums)
if target>nums[-1]:
return n
left=0
right=n-1
while left<right:
#mid=(left+right)//2 (left、right大的时候容易发生溢出)
mid=left+(right-left)//2
if target==nums[mid]:
return mid
elif target<nums[mid]:
right=mid
else:
left=mid+1
return left
class Solution:
def countAndSay(self, n: int) -> str:
prev_person='1'
for i in range(1,n):
next_person,num,count='',prev_person[0],1
for j in range(1,len(prev_person)):
if prev_person[j]==num:
count+=1
else:
next_person+=str(count)+num
num=prev_person[j]
count=1
next_person+=str(count)+num
prev_person=next_person
return prev_person
from itertools import groupby
class Solution:
def countAndSay(self, n: int) -> str:
result='1'
for i in range(1,n):
result=''.join([str(len(list(g)))+k for k,g in groupby(result)])
return result
#动态规划,空间时间复杂度都是O(N)
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
result=[nums[0]]
for i in range(1,len(nums)):
maxsum=max(result[i-1]+nums[i],nums[i])
result.append(maxsum)
return max(result)
空间O(1)的情况
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if not nums:
return 0
if len(nums)==1:
return nums[0]
res=nums[0]
for i in range(1,len(nums)):
nums[i]=max(nums[i-1]+nums[i],nums[i])
res=max(res,nums[i])
return res
class Solution:
def lengthOfLastWord(self, s: str) -> int:
if not s:
return 0
return len(s.strip().split(' ')[-1])
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
res=0
multi=1
for i in digits:
res=res*10+i
res+=1
return [int(i) for i in str(res)]
# 袖珍计算器算法
class Solution:
def mySqrt(self, x: int) -> int:
if x==0:
return 0
ans=int(math.exp(0.5*math.log(x)))
return ans+1 if (ans+1)*2<=x else ans
# 二分法
class Solution:
def mySqrt(self, x: int) -> int:
l,r,ans=0,x,-1
while l<=r:
mid=(l+r)//2
if mid**2<=x:
ans=mid
l=mid+1
else:
r=mid-1
return ans
# 牛顿迭代法
class Solution:
def mySqrt(self, x: int) -> int:
if x==0:
return 0
C,x0=float(x),float(x)
while True:
xi=0.5*(x0+C/x0)
if abs(xi-x0)< 1e-7:
break
x0=xi
return int(x0)
题目链接:添加链接描述
题解链接:添加链接描述
int函数说明:添加链接描述
字符串格式化(format):添加链接描述
# 内置函数法 先转成十进制再转成二进制
class Solution:
def addBinary(self, a: str, b: str) -> str:
return '{0:b}'.format(int(a,2)+int(b,2))
# 位操作
class Solution:
def addBinary(self, a: str, b: str) -> str:
x,y=int(a,2),int(b,2)
while y:
x,y=x^y,(x&y)<<1
return bin(x)[2:]
# hashmap
from collections import Counter
class Solution:
def singleNumber(self, nums: List[int]) -> int:
hashmap=Counter(nums)
for k in hashmap.keys():
if hashmap[k]==1:
return k
#hashset
class Solution:
def singleNumber(self, nums: List[int]) -> int:
return (3*sum(set(nums))-sum(nums))//2
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数