题目一:从根到叶的二进制数之和(难度:简单)
给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。
例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。
对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。返回这些数字之和。题目数据保证答案是一个 32 位 整数。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sum-of-root-to-leaf-binary-numbers
思路:通过递归实现深度优先去遍历树,将每个路径存入到一个列表中,随后遍历该树通过int()函数将二进制数转换为十进制数然后相加即可。
class Solution:
def sumRootToLeaf(self, root: Optional[TreeNode]) -> int:
list=[]
digui(list,root,'')
sum=0
for item in list:
sum+=int(item,2)
return sum
def digui(list,root,path):
if root==None:
return
if root.left==None and root.right==None:
list.append(path+str(root.val))
return
digui(list,root.left,path+str(root.val))
digui(list,root.right,path+str(root.val))
题目二:无重复字符的最长子串(难度:中等)
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters
思路:使用两个指针指向字符串的左右边界,通过固定左指针,移动右指针来记录不重复字符的最长子串。当出现重复字符时将子串长度保存,移动左指针指向下一个字符,直至左指针移动到最后为止。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
sonS = set()
length=0;right=-1
for left in range(len(s)):
if left!=0:
sonS.remove(s[left-1])
while right+1<len(s) and s[right+1] not in sonS:
sonS.add(s[right+1])
right+=1
length=max(length,right-left+1)
return length
题目三:字形变换(难度:中等)
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zigzag-conversion
思路:Z字形排列最长的分隔距离为2(n-1)。一个Z字形里每行分为左右间隔,左间隔为上一行减2,右间隔为上一行加2。故通过这一特点,判断每次需要相加的为左间隔还是右间隔,然后进行相加。如果行数为1,直接返回原字符串即可。
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows==1:
return s
i=0
leftN=2*numRows-2
rightN=0
newS=''
while i<numRows:
flag=0
index=i
while index<len(s):
newS+=s[index]
if rightN==0 or leftN==0:
index+=max(leftN,rightN)
elif flag==0:
index+=leftN
flag=1
elif flag==1:
index+=rightN
flag=0
leftN-=2;rightN+=2
i+=1
return newS
题目四:实现strStr()(难度:简单)
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/implement-strstr
思路:判断字符串needle是否在haystack中,不在则返回-1。否则直接调用index方法即可。
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
if needle in haystack:
return haystack.index(needle)
elif needle=='':
return 0
else:
return -1
题目五:Pow(x,n)(难度:中等)
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn )。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/powx-n
思路:本题会有底数很小,指数很大的情况,故不能通过常规的思路去解决。可以采用分治的思路,即通过快速幂算法,从x开始,每次直接把上一次的结果进行平方,这样可以大大减少循环的次数。如果n为奇数时,一些情况需要额外乘以x,故采用递归。当要计算x的n次方时,可以递归计算出x的n/2次方,同时对n/2向下取整。根据递归的结果,如果n为偶数,那么不需要额外乘以x,否则便需要乘以x。递归的结束条件为n等于0时返回1。
class Solution:
def myPow(self, x: float, n: int) -> float:
if n==0:
return 1
elif n>0:
return digui(x,n)
else:
return 1.0/digui(x,-n)
def digui(x,n):
if n==0:
return 1.0
y=digui(x,n//2)
if n%2==0:
return y*y
else:
return y*y*x