Leetcode题解 0025期

羡慕、嫉妒、以及负能量爆发

0092题 反转链表 II【Reverse Linked List II】

题目:
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明: 1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

题目相对严谨

链表题目,小心NULL的情况

解题思路:
这题其实难点在于必须一趟扫描,但实际上相对好些。想起来之前说新建链表什么之类的胡话,那种东西是肯定不对的,说了要在链表上面进行操作,那就不能新建链表啊……
post代码:

class Solution:
    def reverseBetween(self, head, m, n):
        if head == None or m == n: return head
        return_head = None
        record_head = None
        tail = None
        one_node_before_tail = None
        cnt = 1
        flag = False
        while head != None:
            if cnt < m:
                if return_head == None and record_head == None:
                    return_head = record_head = head
                record_head = head
                head = head.next
            elif cnt == m:
                tail = one_node_before_tail = head
                head = head.next
                tail.next = None
                one_node_before_tail.next = None
            elif cnt <= n:
                tmp_node = head
                head = head.next
                tmp_node.next = one_node_before_tail
                one_node_before_tail = tmp_node
            else:
                flag = True
                if record_head == None:
                    return_head = record_head = one_node_before_tail
                else:
                    record_head.next = one_node_before_tail
                tail.next = head
                break

            cnt += 1

        if not flag:
            if record_head == None:
                return_head = record_head = one_node_before_tail
            else:
                record_head.next = one_node_before_tail

        return return_head

虽然我的代码可能并不是最简洁的,但是思路是正确的,而且读起来毫无压力,非常有逻辑感,而且小心翼翼。


0093题 复原IP地址【Restore IP Addresses】

题目:
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:

输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]

题目相对严谨

需要注意:
1. IP地址的定义,及其上限
2. 注意处理0的问题,0一定有意义,不能没有否则不应该存在0
3. 如果没有解法的话,返回应该是空集
4. Robust

解题思路:
这题就是暴力搜索或者枚举点可能出现的位置,然后注意上述情况即可

class Solution:
    def restoreIpAddresses(self, s):
        n = len(s)
        res = []
        tmp = []
        for i in range(1,1+3):
            if i > n: break
            if len(s[0:i]) != len(str(int(s[0:i]))): break
            if int(s[0:i]) > 255: break
            tmp.append(s[0:i])
            for j in range(i+1,i+4):
                if j > n: break
                if len(s[i:j]) != len(str(int(s[i:j]))): break
                if int(s[i:j]) > 255: break
                tmp.append(s[i:j])
                for k in range(j+1,j+4):
                    if k >= n: break
                    if len(s[j:k]) != len(str(int(s[j:k]))): break
                    if int(s[j:k]) > 255: break
                    tmp.append(s[j:k])

                    if len(s[k:]) > 3: tmp.pop();continue
                    if len(s[k:]) != len(str(int(s[k:]))): tmp.pop();continue
                    if int(s[k:]) > 255: tmp.pop();continue

                    tmp.append(s[k:])
                    res.append(".".join(tmp))

                    tmp.pop()
                    tmp.pop()
                tmp.pop()
            tmp.pop()

        return res

模拟栈就可以了,以上


0094题 二叉树的中序遍历【Binary Tree Inorder Traversal】

题目:
给定一个二叉树,返回它的中序遍历。
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
示例:

输入: [1,null,2,3]
   1
    \
     2
    /
   3

输出: [1,3,2]

题目相对严谨

除Robust外无需注意太多

解题思路:
周一周二周四周五一日三道题,其他时间一天四道题,先这样。
终于开始树了,2333,这题很简单,不用多说,直接完成进阶要求

class Solution:
    def inorderTraversal(self, root):
        res = []
        stack = []
        if root == None: return res
        p = root
        while True:
            while p != None:
                stack.append(p)
                p = p.left
            if len(stack) == 0: break
            p = stack.pop()
            res.append(p.val)

            p = p.right

        return res

猜你喜欢

转载自blog.csdn.net/bright_silmarillion/article/details/80811041