数据结构习题

编程:
1、 判断两棵树是否相等:node1, node2

2、 判断node1这棵树是否完全包含node2这棵树

3、 扫地机器人,上下左右四个方向,已经走过的地方不会再去,走n
步一共有多少种可能路径

4、二分查找,时间复杂度是多少

5、两个数组如何判断元素完全相等

6、最长不重复子串(取尺or直接暴力)

7、模拟一个栈

8、判断一棵树是否是完全二叉树(bfs)

'''完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐。)'''

 1 # 判断一棵树是否为完全二叉树
 2 # 左无、右有 ==> 返回 False
 3 # 左无、右无 ==> 激活判断:之后所有节点都是叶节点
 4 # 左有、右无 ==> 激活判断:之后所有节点都是叶节点        ==》      只要右无之后都必须是叶节点
 5 # 左有、右有 ==> 不用处理
 6 import queue
 7 def isCBTree(head):
 8     if not head:
 9         return False
10     que = queue.Queue()
11     que.put(head)
12     flag = False                                # 是否激活判断过程
13     while not que.empty():
14         head = que.get()
15         if head.left:
16             que.put(head.left)
17         if head.right:
18             que.put(head.right)
19 
20         if (not head.left) and head.right:      #左空、又不空必不为CBT
21             return False
22 
23         if flag:                                # 若过程激活则判断节点是否为叶节点
24             if head.left or head.right:
25                 return False
26 
27         if not (head.left and head.right):      # 左不空、右空 | 左空、右空
28             flag = True                         # 激活判断在此之后的节点必须为叶节点
29 return True

9、有序数组查找某个树是否出现(二分)

字节算法题

10、反转链表

#反转链表
def reverse(self, head):
    if not head or not head.next:
        return head
    else:
        newhead = self.reverse(head.next) # 新的节点递归head的下一个节点
        head.next.next = head # 当前head节点的下一个节点的下一个节点绕回head
        head.next = None # 反转当前节点后,首节点的下一个节点为空
        return newhead

11、python统计出现单词的个数

# 借助collections模块
import re # re模块提供各种正则表达式的匹配
from collections import Counter

with open("this.txt", 'r', encoing = 'utf-8') as fd:
    texts = fd.read() # 文件的内容读取成一个字符串
    count = Counter(re.split(r"\W+", texts))  # 以单词为分割
    #\W	匹配任意非数字和字母:[^a-zA-Z0-9]
    # re.split() 作用:按照能够匹配的 子串(字符或字符串) 将 字符串 分割后返回 列表 。
result = count.most_common(10) # 统计最长使用的前十个
# most_common()函数用来实现Top n 功能
print(result)

12、三数之和为0


# 三数之和为0,找出所有满足条件的三元组,排序+双指针
def three(nums):
    n = len(nums)
    res = []
    if not nums or n < 3:
        return []
    nums.sort() # 先进行排序
    res = []
    for i in range(n):
        if nums[i] > 0:
            return res # 最小的数都大于0,直接为空
        if (i > 0 and nums[i] == nums[i - 1]):
            continue
        l = i + 1
        r = n - 1
        while l < r:
            if (nums[i] + nums[l] + nums[r]) == 0: # 选定i+ 左+ 右 = 0 ,加入数组
                res.append(nums[i], nums[l], nums[r])
                while (l < r and nums[l] == nums[l + 1]): # 左边连着相等 or 右边连着相等
                    l += 1
                while (l < r and nums[r] == nums[r - 1]):
                    r -= 1
                l += 1
                r -= 1
            elif (nums[i] + nums[l] + nums[r] > 0): # 三数大于0,左移 三数小于0,右移
                r -= 1
            else:
                l += 1
        return res

13、使用正则表达式匹配ip4

#!/usr/bin/python2.7
# -*- coding:utf-8 -*-
import re
 
 
def ipv4_addr_check(ipAddr):
    p = re.compile('^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$')
    if p.match(ipAddr):
        return True
    else:
        return False
 
 
print ipv4_addr_check("120.112.112.110")  # 输出结果为True
 
print ipv4_addr_check("172.31.137.256")  # 输出结果为False

14、中文亿级数转化为int
按照亿万分割成三个部分

数据结构:
堆和栈的区别–java

内存泄漏和内存溢出

1、内存泄漏memory leak :
是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。

2、内存溢出 out of memory :
指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。

3、二者的关系
内存泄漏的堆积最终会导致内存溢出
内存溢出就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误。
内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。就相当于你租了个带钥匙的柜子,你存完东西之后把柜子锁上之后,把钥匙丢了或者没有将钥匙还回去,那么结果就是这个柜子将无法供给任何人使用,也无法被垃圾回收器回收,因为找不到他的任何信息。
内存溢出:一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出。比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出。说白了就是我承受不了那么多,那我就报错,
内存泄漏和溢出

数组和链表的区别:
不同:
链表是链式的存储结构;数组是顺序的存储结构。
链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。
链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难;
数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再编程一开始时指定,故当达到最大长度时,扩充长度不如链表方便。
相同:
两种结构均可实现数据的顺序存储,构造出来的模型呈线性结构。

平衡二叉树:

class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        if not root:
            return True
        return abs(self.depth(root.left) - self.depth(root.right)) <= 1 and self.isBalanced(root.left) and self.isBalanced(root.right)


    def depth(self, root):
        if not root:
            return 0
        return max(self.depth(root.left), self.depth(root.right)) + 1
class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        return self.recur(root) != -1

    def recur(self, root):
        if not root:
            return 0
        left = self.recur(root.left) # 先递归判断左子树是不是平衡二叉树
        if left == -1: # 如果不是,直接返回
            return -1
        right = self.recur(root.right)
        if right == -1:
            return -1
        if abs(left - right) <= 1: # 再判断左右子树的高度差
            return max(left, right) + 1  
        else:
            return -1 # 如果比1大,就返回-1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值