剑指offer刷题记录|顺序刷题第三周

剑指offer 20 表示数值的字符串

class Solution:
    def isNumber(self, s: str) -> bool:
        # 有限状态机,短时间内根本写不出来
        # python直接float 虽然面试0分
        try:
            float(s)
        except:
            return False
        return True

剑指offer 24 反转链表

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        # 双指针法,有点难理解,还是看解释吧QAQ。反正结果是从后往前构造的,不断地添加前面结点
        cur, pre = head, None
        while cur:
            tmp = cur.next 
            cur.next = pre 
            pre = cur 
            cur = tmp
        return pre

剑指offer 22 链表中倒数第k个节点

class Solution:
    def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
        # 法一:确定返回的列表和原列表中间距离即可得到结果,这个距离是len-k
        res=[]
        pre = head
        while head.next:
            res.append(head.val)
            head = head.next
        res.append(head.val)
        skip = len(res) - k
        while skip:
            pre = pre.next
            skip -= 1
        return pre

        # 法二:双指针,第一个指针先走k步,然后一起走到终点,没走完的那个还剩k步,就是结果
        # 这样就不用统计链条长度len,非常节省时间
        p, q = head, head
        while k:
            p = p.next
            k -= 1
        while p:
            p = p.next
            q = q.next
        return q

剑指offer 28 对称的二叉树

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        def is_abba(L, R):
          	# 递归结束条件1,两个节点都为null 则 True
            if not L and not R: return True
            # 递归结束条件2,一个null一个不null 或者 val不同 则 False
            if not L or not R or L.val!=R.val: return False
            # 递归分两种,一个False则 return False,所以是and
            return is_abba(L.left, R.right) and is_abba(L.right, R.left)
        # 对称二叉树,左右结点需要满足三个条件:L.val == R.val & L.left == R.right & L.right == R.left
        return is_abba(root.left, root.right) if root else True

剑指offer 21 调整数组顺序,奇数在偶数前面

class Solution:
    def exchange(self, nums: List[int]) -> List[int]:
        # 双指针, 奇数往前放,偶数往后放。只需要一遍,不过空间复杂度很高。
        left, right = 0, len(nums)-1
        res = [-1]*len(nums)
        for ele in nums:
            if ele % 2 == 1:
                res[left] = ele
                left += 1
            else:
                res[right] = ele
                right -= 1
        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值