首页 > 其他分享 >力扣

力扣

时间:2022-09-28 22:56:56浏览次数:42  
标签:digit end self sign 力扣 return root

1、如果需要考虑之前的状态就可以使用有限状态机

有限状态机:

 

 Leecode 第8题:

 

 

class A:
    def __init__(self):
        self.sign=1
        self.ans=0
        self.currentState="empty"
        self.dict={
            "empty":["empty","sign","digit","end"],
            "sign":["end","end","digit","end"],
            "digit":["end","end","digit","end"],
            "end":["end","end","end","end"]
        }
    def tocondition(self,s:str,i:int): # 条件转化为数字
        if s[i]==' ':
            return 0
        elif s[i]=='+' or s[i]=='-':
            return 1
        elif s[i].isdigit():
            return 2
        else:
            return 3
    def deal(self,s:str,i:int):
        condition = self.tocondition(s,i)
        self.currentState=self.dict[self.currentState][condition]
        if self.currentState=="sign":
            self.sign = -1 if s[i]=='-' else 1
        if self.currentState=='digit':
            self.ans=self.ans*10+int(s[i])

class Solution:
    def myAtoi(self, s: str) -> int:
        a = A()
        for i in range(len(s)):
            a.deal(s,i)
        res = a.sign * a.ans
        if res<-2**31:
            res=-2**31
        if res>2**31-1:
            res=2**31-1
        return res

 2、非递归先序遍历

准备一个栈,然后访问根节点,入栈,走到左子树,访问,入栈,左子树没了访问不了,出栈一个元素,走到它的右子树,访问根节点...直到访问不了且栈空了(想用刚刚的元素,就可以想到栈)

        stack = []
        while root or len(stack)!=0:
            if root:
                print(root.val)
                stack.append(root)
                root=root.left
            else:
                root = stack.pop()
                root = root.right

2、层次序列生成二叉树

对当前节点,给他左边加节点,然后入队,右边加节点,然后入队,出队一个元素,对该元素左边加节点...(想到用老之前的元素,就可以想到队列)

    def create(self,nums): # 层次建立二叉树
        root = Node(nums[0])
        q = queue.Queue(len(nums))
        q.put(root)
        i = 1
        while i<=len(nums):
            if nums[i]=='null':
                i+=1
                continue
            node = q.get()
            node.left = Node(nums[i])
            q.put(node.left)
            i+=1
            if i==len(nums):
                break
            if nums[i]=='null':
                i+=1
                continue
            node.right = Node(nums[i])
            q.put(node.right)
            i+=1
        return root

    def mid(self,root): # 非递归中序遍历
        stack = []
        while root or len(stack)!=0:
            if root:
                stack.append(root)
                root=root.left
            else:
                top = stack.pop()
                print(top.val)
                root = top.right

    def pre(self,root): # 非递归先序遍历
        stack = []
        while root or len(stack)!=0:
            if root:
                print(root.val)
                stack.append(root)
                root=root.left
            else:
                root = stack.pop()
                root = root.right

 3

标签:digit,end,self,sign,力扣,return,root
From: https://www.cnblogs.com/pjishu/p/16739869.html

相关文章

  • 力扣349(java&python)-两个数组的交集(简单)
    题目:给定两个数组 nums1 和 nums2,返回它们的交集 。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。 示例1:输入:nums1=[1,2,2,1],num......
  • 力扣做题 09. 第 k 个数
    这题主要难度还是理解题意,找到规律,以及实践 有些数的素因子只有3,5,7,请设计一个算法找出第k个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数......
  • 力扣刷题详解(含代码动态展示)
    (文章目录)一、448.找到所有数组中消失的数字给你一个含n个整数的数组nums,其中nums[i]在区间[1,n]内。请你找出所有在[1,n]范围内但没有出现在nums中的数......
  • 力扣算法第1题--两数之和(暴力题解&优化题解)
    两数之和题目描述:给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输......
  • 力扣44. 通配符匹配
    解题思路还是用隐马尔科夫链条的思路,解题时候发现内存超出了,原来是没有对链条做去重 给定一个字符串 (s)和一个字符模式 (p),实现一个支持 '?' 和 '*' 的通配......
  • 力扣做题20. 连续中值
    这类型的题以前做过,二分法找中间值,算是温故知新吧 随机产生数字并传递给一个方法。你能否完成这个方法,在每次产生新值时,寻找当前所有值的中间值(中位数)并保存。中位数是......
  • 力扣1235——规划兼职工作
    1235.规划兼职工作难度困难你打算利用空闲时间来做兼职工作赚些零花钱。这里有 n 份兼职工作,每份工作预计从 startTime[i] 开始到 endTime[i] 结束,报酬为 ......
  • 力扣困难级别-10. 正则表达式匹配
    这道题昨天做了一下午,用动态规划、以及循环的方式也没弄出来,去评论去看了下,确实挺难的。晚上想到可以用做隐马尔科夫模型的思路,每次根据上一次的状态生成下一次的状态,最后......
  • 力扣217(java&python)-存在重复元素(简单)
    题目:给你一个整数数组nums。如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false。 示例1:输入:nums=[1,2,3,1]输出:true示例2:输入......
  • 力扣算法之数组中出现次数超过一半的数字
    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例:输入:[1,2,3,2,2,2,5,4,2]输......