360笔试
360笔试的选择题是我做过最难的,代码题倒是还好
- 循环队列的特点:队头指针和队尾指针指向同一个单元的时候不一定是队满或者队空,可以通过取模的运算来实现逻辑循环
- Java中的原始数据类型有什么特点
- 有向图中出度为s,则入度为多少?
- 使用游标的5个步骤:声明,打开,读取,关闭,删除(释放)
- 栈链:通过链表实现的栈,可以在任意位置出栈,可用于协程这种切换
- C++指针相关
- C++中四种强制转换:用于类型强转的是static_
- 类,对象,实例关系和区别:类是模版,对象是new 过的类 (包含 可以实例化的 和不能实例化的,比如抽象类就不能实例化 ,比如抽象类就不能实例化) ,可以实例化的对象 就叫实例
- dfs无环有向图中,退栈打印相应顶点值,是逆拓扑有序的
- C++中三种继承方式,私有继承会让父类中的public,protected属性在子类中变成private属性,所以孙子类就无法在继承这些属性了
- 内存属于什么资源–可重用资源
- 分治法能解决的问腿:递归回溯,快排,二分搜索,归并
- 序列图:没懂
- 动态链接库的默认搜索路径:/lib
- Linux中修改引导程序grub的配置文件路径:boot/grub/grub.conf
- Java中,B继承 A,A有m方法,B有n方法,A b = new B()可以,b.m()可以
- kmp算法
- 计算开销最小:A1(5*25)…怎么计算开销最小:没懂
- LP问题:??????
- 用例图的介绍:??????
代码题:上下班打卡,密码验证(和之前小米的笔试题一摸一样)
360太难了,是我不配
二叉树的层平均值
链接:题目链接
题目描述
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
示例 1:
输入:
3
/
9 20
/
15 7
输出:[3, 14.5, 11]
解释:
第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。
解题思路–深度优先搜索
需要用两个数组,一个存这一层的节点个数,一个存当前层的节点的值的和
既然是深度优先搜索,那就要用到递归,递归函数要先确定条件分支,在同一层,只需要将当前深度的节点和加上,节点个数加上
代码实现
class Solution:
def averageOfLevels(self, root: TreeNode) -> List[float]:
def dfs(root,level):
if not root:
return
if level < len(totals):
counts[level] += 1
totals[level] += root.val
else:
counts.append(1)
totals.append(root.val)
dfs(root.left,level+1)
dfs(root.right,level+1)
counts = []
totals = []
dfs(root,0)
res = []
for x,y in zip(totals,counts):
res.append(x/y)
return res
括号生成
链接:题目链接
题目描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
解题思路—回溯法+递归(中等题)
我们可以设置两个代表左括号数量和右括号数量的变量,如果左括号数量<n则可以继续添加左括号,如果右括号数量<左括号数量,则右括号可以继续添加,在每个分支条件里面加上一个s.pop()表示回溯,也就是说可以从当前步骤重新开始,这样就能够将所有可能的情况都列举出来
代码实现
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
# left和right分别表示左括号个数和右括号个数
res = []
def backtrack(S,left,right):
if len(S) == 2*n:
res.append(''.join(S))
return
if left < n:
S.append('(')
backtrack(S,left+1,right)
# 这里可能会有很多层递归,就有很多层的回溯
S.pop()
if right < left:
S.append(')')
backtrack(S,left,right+1)
S.pop()
backtrack([],0,0)
return res