zoukankan      html  css  js  c++  java
  • 剑指offer刷题笔记

    由于本人的主力语言为python,以下面试题都用python实现

    面试题之二:实现Singleton模式

    题目:实现一个单例模式

    class Singleton(object):
        _instance = None
        _instance_lock = threading.Lock()
    
        def __init__(self, *args, **kwargs):
            pass
    
        def __new__(cls, *args, **kwargs):
            if cls._instance:
                return cls._instance
            with cls._instance_lock:
            	cls._instance = object.__new__(cls)
            return cls._instance
    

    面试题之三:二维数组中的查找

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数

    例如下面的数组,如果查找数字7,则返回True;如果查找数字5,则返回False

    [
        [1,2,8,9],
        [2,4,9,12],
        [4,7,10,13],
        [6,8,11,15]
    ]
    

    思路:

    1.从左下角开始选取元素,将此元素与目标元素比较,有三种可能的情况

    1)此元素与目标元素相等,返回True,程序结束

    2)此元素小于目标元素,则在这个元素的右侧开始查找

    3)此元素大于目标元素,则在这个元素的上侧开始查找

    2.重复步骤1,直到结束,返回False

    代码

    def find_in_partially_sorted_matrix(matrix, num):
        '''
        :type matrix: List[List[int]]
        :type num: int
        :rtype: bool
        '''
        if not matrix or not matrix[0]:
            return False
        if num < matrix[0][0] or num > matrix[-1][-1]:
            return False
    
        i, j = len(matrix) - 1, 0
        while i >= 0 and j <= len(matrix[0]) - 1:
            if matrix[i][j] == num:
                return True
            elif matrix[i][j] < num:
                j += 1
            elif matrix[i][j] > num:
                i -= 1
        return False
    
    
    if __name__ == '__main__':
        matrix = [
                    [1, 2, 8, 9],
                    [2, 4, 9, 12],
                    [4, 7, 10, 13],
                    [6, 8, 11, 15]
                ]
        #print(find_in_partially_sorted_matrix(matrix, 10))
        #print(find_in_partially_sorted_matrix(matrix, 4))
        #print(find_in_partially_sorted_matrix(matrix, 15))
        #print(find_in_partially_sorted_matrix(matrix, 9))
        #print(find_in_partially_sorted_matrix(matrix, 5))
        #print(find_in_partially_sorted_matrix(matrix, -1))
        #print(find_in_partially_sorted_matrix(matrix, 1))
        #print(find_in_partially_sorted_matrix(matrix, 18))
    
        matrix = [
                [-2, 1, 5, 9]
                ]
        #print(find_in_partially_sorted_matrix(matrix, -2))
        #print(find_in_partially_sorted_matrix(matrix, 5))
        #print(find_in_partially_sorted_matrix(matrix, 9))
        #print(find_in_partially_sorted_matrix(matrix, -1))
        #print(find_in_partially_sorted_matrix(matrix, -3))
        #print(find_in_partially_sorted_matrix(matrix, 10))
    
        matrix = [
                [-5,],
                [-2,],
                [3,],
                [6,],
                [8,]
                ]
        #print(find_in_partially_sorted_matrix(matrix, 0))
        #print(find_in_partially_sorted_matrix(matrix, -8))
        #print(find_in_partially_sorted_matrix(matrix, 6))
        #print(find_in_partially_sorted_matrix(matrix, 8))
        #print(find_in_partially_sorted_matrix(matrix, -5))
        #print(find_in_partially_sorted_matrix(matrix, 10))
    
        matrix = []
        #print(find_in_partially_sorted_matrix(matrix, 3))
    
        matrix = [
                [],
                [],
                []
                ]
        print(find_in_partially_sorted_matrix(matrix, 5)) 
    

    面试题之五:从尾到头打印链表

    class ListNode(object):
    
        def __init__(self, val):
            self.val = val
            self.next = None
    
    def print_list_node_reversingly(head: ListNode) -> None:
        stack = []
        p = head
        while p is not None:
            stack.append(p.val)
            p = p.next
        while len(stack) != 0:
            print(stack.pop())
    
    
    if __name__ == '__main__':
        p1 = ListNode(1)
        p2 = ListNode(2)
        p3 = ListNode(3)
        p4 = ListNode(4)
        p1.next = p2
        p2.next = p3
        p3.next = p4
        print_list_node_reversingly(p1)
    
        p1 = ListNode(1)
        print_list_node_reversingly(p1) 
        p = None
        print_list_node_reversingly(p)
    

    面试题之六:重建二叉树

    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树,输出二叉树的头结点

    from typing import List
    
    
    class TreeNode(object):
        def __init__(self, val):
            self.val = val
            self.left = None
            self.right = None
    
    
    def construct_binary_tree(preorder: List[int], inorder: List[int]) -> TreeNode:
        """重建二叉树"""
        if len(preorder) == 0:
            return None
        if len(preorder) == 1:
            root = TreeNode(preorder[0])
            return root
        index = inorder.index(preorder[0])
        left_child_preorder = preorder[1:index + 1]
        right_child_preorder = preorder[index + 1:]
        left_child_inorder = inorder[:index]
        right_child_inorder = inorder[index + 1:]
        root = TreeNode(preorder[0])
        root.left = construct_binary_tree(left_child_preorder, left_child_inorder)
        root.right = construct_binary_tree(right_child_preorder, right_child_inorder)
    
        return root
    
    
    def level_order_travel(root: TreeNode) -> List:
        """输出宽度优先遍历的结果,用于验证"""
        levels = []
        if not root:
            return levels
    
        def helper(node: TreeNode, level: int) -> None:
            if len(levels) == level:
                levels.append([])
    
            levels[level].append(node.val)
    
            if node.left:
                helper(node.left, level + 1)
            if node.right:
                helper(node.right, level + 1)
    
        helper(root, 0)
        return levels
    
    
    if __name__ == '__main__':
        preorder = [3, 9, 20, 15, 7]
        inorder = [9, 3, 15, 20, 7]
        root = construct_binary_tree(preorder, inorder)
        print(level_order_travel(root))
    
        preorder = [1, 2, 4, 8, 9, 14, 5, 10, 11, 3, 6, 12, 13, 7]
        inorder = [8, 4, 14, 9, 2, 10, 5, 11, 1, 12, 6, 13, 3, 7]
        root = construct_binary_tree(preorder, inorder)
        print(level_order_travel(root))
    
        preorder = [1, 2, 3]
        inorder = [1, 3, 2]
        root = construct_binary_tree(preorder, inorder)
        print(level_order_travel(root))
        
        preorder = [1, 2, 3]
        inorder = [3, 2, 1]
        root = construct_binary_tree(preorder, inorder)
        print(level_order_travel(root))
     
        preorder = [1, 2, 3]
        inorder = [1, 2, 3]
        root = construct_binary_tree(preorder, inorder)
        print(level_order_travel(root))
     
        preorder = [2]
        inorder = [2] 
        root = construct_binary_tree(preorder, inorder)
        print(level_order_travel(root))
    
        preorder = []
        inorder = []
        root = construct_binary_tree(preorder, inorder)
        print(level_order_travel(root))
    

    面试题之七:用两个栈实现队列

    题目:用两个栈实现队列,分别完成在尾部插入结点和在队列头部删除结点的功能

    class Stack(object):
    
        def __init__(self):
            self.stack = []
    
        def push(self, item):
            self.stack.append(item)
    
        def pop(self):
            if not self.stack:
                return "empty stack!"
            return self.stack.pop()
    
        def is_empty(self):
            return len(self.stack) == 0
    
    
    class MyQueue(object):
    
        def __init__(self):
            self.stack1 = Stack()
            self.stack2 = Stack()
    
        def append_tail(self, item):
            self.stack1.push(item)
    
        def delete_head(self):
            if not self.stack2.is_empty():
                return self.stack2.pop()
            if self.stack1.is_empty():
                return "empty queue!"
            while not self.stack1.is_empty():
                self.stack2.push(self.stack1.pop())
            return self.stack2.pop()
    
    
    if __name__ == "__main__":
        q1 = MyQueue()
        q1.append_tail(1)
        q1.append_tail(2)
        q1.append_tail(3)
        print(q1.delete_head())
        print(q1.delete_head())
        print(q1.delete_head())
        print(q1.delete_head())
    
        print("-------------------")
    
        q2 = MyQueue()
        q2.append_tail(1)
        print(q2.delete_head())
        print(q2.delete_head())
        q2.append_tail(2)
        q2.append_tail(3)
        print(q2.delete_head())
    

    补充:用两个队列实现栈

    题目:用两个队列实现栈,分别完成压入和弹出功能

    from queue import Queue
    
    
    class Stack(object):
    
        def __init__(self):
            self.queue1 = Queue()
            self.queue2 = Queue()
    
        def push(self, item):
            if self.queue1.empty():
                self.queue2.put(item)
            else:
                self.queue1.put(item)
    
        def pop(self):
            if self.queue1.empty() and self.queue2.empty():
                return "empty stack!"
            if self.queue1.empty():
                while not self.queue2.empty():
                    item = self.queue2.get()
                    if self.queue2.empty():
                        return item
                    self.queue1.put(item)
            else:
                while not self.queue1.empty():
                    item = self.queue1.get()
                    if self.queue1.empty():
                        return item
                    self.queue2.put(item)
                    
                    
    if __name__ == "__main__":
        s1 = Stack()
        s1.push(1)
        s1.push(2)
        print(s1.pop())
        print(s1.pop())
        print(s1.pop())
    
        print("--------------")
    
        s2 = Stack()
        print(s2.pop())
        s2.push(1)
        s2.push(2)
        print(s2.pop())
        s2.push(3)
        print(s2.pop())
        print(s2.pop())
        print(s2.pop())   
    

    持续更新中...

  • 相关阅读:
    Apache Pulsar:实时数据处理中消息,计算和存储的统一
    在STICORP使用Apache Pulsar构建数据驱动的应用程序
    简介Apache Pulsar-下一代分布式消息系统
    新一代消息系统Apache Pulsar 2.1 重磅发布
    为什么透过链接服务器写入,速度会很慢
    在Windows7 下调试CodeSmith 注意事项
    魔幻的生活 荒诞的延续
    Git和Github的应用与命令方法总结
    SimpleDateFormat使用简析
    Java中Long与long的区别(转)
  • 原文地址:https://www.cnblogs.com/zzliu/p/12368177.html
Copyright © 2011-2022 走看看