• 2018阿里文学春招面试题


    有序二叉树的中序列表(非递归写法)

    我能想到的非递归写法就是自己用栈,实现上有两种方式:

    • 在一个栈里面存放两种类型的元素
    • 用两个栈,一个栈放结点、一个栈放数字
    sta=new Stack()
    sta.push(tree)
    while sta.notEmpty:
        now=sta.pop()
        if typeof now == Node:
            if now.right:sta.push(now.right)
            sta.push(now.value)
            if now.left:sta.push(now.left)
        else:
            print(now.value)
    
    

    leetcode上面有这道题:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/description/

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def inorderTraversal(self, root):
            """
            :type root: TreeNode
            :rtype: List[int]
            """
            ans=[]
            if not root:return ans
            a=[root]
            while len(a):
                now=a.pop()
                if type(now)==TreeNode:
                    if now.right:
                        a.append(now.right)
                    a.append(now.val)
                    if now.left:
                        a.append(now.left)
    
                else:
                    ans.append(now)
            return ans
    

    最长连续序列

    给定一个int数组,求数组中最长的连续单元。
    如:[1,2,7,8,5,9,-2,3,4],答案是5,因为包含1,2,3,4,5是最长的。

    要求O(N)时间复杂度,空间复杂度不限。

    解:用两个哈希表beg和end,分别表示片段的开头和结尾。从左到右扫描数组,对于元素x,考虑它的两种情况:

    • 它可以拼接到上一个片段
    • 它可以拼接到下一个片段

    这两个条件的取值有00,01,10,11四种情况,分四种情况讨论,拼接片段即可。

    class Node:
        int beg
        int end
    beg=dict()
    end=dict()
    for i in a:
        if i+1 in beg and i-1 in end:
            prev=end[i-1]
            next=beg[i+1]
            node.beg=prev.beg
            node.end=next.end
            del beg[i+1]
            del end[i-1]
            beg[prev.beg]=node
            end[next.end]=node
        elif i+1 in beg:
            node=beg[i+1]
            node.beg=i
            del beg[i+1]
            beg[i]=node
        elif i-1 in end:
            node=end[i-1]
            del end[i-1]
            end[i]=node
            node.end=i
        else:
            node=Node(i,i)
            beg[i]=node
            end[i]=node
    ans=0
    for i in beg.values:
        ans=max(ans,i.end-i.beg+1)
    print(ans)
    

    大文件求交集

    有两个大文件,每个文件都包含50亿个字符串,每个字符串都是64B,求这两个大文件的交集。

    解:用类似布隆过滤器的东西来判断是否包含某个字符串。布隆过滤器其实就是哈希,用一个bit表示是否包含。
    首先对于第一个文件,开辟一个大数组(包含100亿个bit),对于文件中的每个字符串,计算哈希值,将对应位置成1。然后对于第二个文件中的每个字符串,计算哈希,判断第一个文件中是否包含。

  • 相关阅读:
    二、JAVA通过JDBC连接mysql数据库(操作)
    一、JAVA通过JDBC连接mysql数据库(连接)
    while loading persisted sessions [java.io.EOFException]的三种解决办法!
    8大排序算法的java实现--做个人收藏
    数据库索引实现原理—B_TREE
    数据库查询优化方法
    webservice原理及基于cxf开发的基本流程
    Java多线程之Thread、Runnable、Callable及线程池
    随机数问题--已知有个Random7()的函数,返回1到7随机自然数,让利用这个Random7()构造Random10()随机1~10.
    深入Java—String源代码
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/8577002.html
Copyright © 2020-2023  润新知