算法练习(5)

 题目一:从根到叶的二进制数之和(难度:简单)

给出一棵二叉树,其上每个结点的值都是 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值