这 400 道面试题,决定了你去 BAT 还是 TMD
5/
3 6/
2 4/1
说明:保证输入的 K 满足 1<=K<=(节点数目)
树相关的题目,第一眼就想到递归求解,左右子树分别遍历。联想到二叉搜索树的性质,root 大于左子树,小于右子树,如果左子树的节点数目等于 K-1,那么 root 就是结果,否则如果左子树节点数目小于 K-1,那么结果必然在右子树,否则就在左子树。因此在搜索的时候同时返回节点数目,跟 K 做对比,就能得出结果了。
/**
Definition for a binary tree node.**/
public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }}
class Solution {private class ResultType {
boolean found; // 是否找到
int val; // 节点数目 ResultType(boolean found, int val) {this.found = found;thi
s.val = val;}}
public int kthSmallest(TreeNode root, int k) {return kthSmallestHelper(root, k).val;}
private ResultType kthSmallestHelper(TreeNode root, int k) {if (root == null) {return new ResultType(false, 0);}
ResultType left = kthSmallestHelper(root.left, k);
// 左子树找到,直接返回 if (left.found) {return new ResultType(true, left.val);}
// 左子树的节点数目 = K-1,结果为 root 的值 if (k - left.val == 1) {return new ResultType(true, root.val);}
// 右子树寻找 ResultType right = kthSmallestHelper(root.right, k - left.val - 1);if (right.found) {return new ResultType(true, right.val);}
// 没找到,返回节点总数 return new ResultType(false, left.val + 1 + right.val);}}
1.1.4 LRU 缓存机制
题目:LRU 缓存机制设计和实现一个 LRU(最近最少使用)缓存数据结构,使它应该支持以下操作:get 和 put。get(key) - 如果 key 存在于缓存中,则获取 key 的 value(总是正数),否则返回 -1。put(key,value) - 如果 key 不存在,请设置或插入 value。当缓存达到其容量时,它应该在插入新项目之前使最近最少使用的项目作废。
1.1.5 关于 epoll 和 select 的区别,以下哪些说法是正确的(多选)
A. epoll 和 select 都是 I/O 多路复用的技术,都可以实现同时监听多个 I/O 事件的状态。
B. epoll 相比 select 效率更高,主要是基于其操作系统支持的 I/O 事件通知机制,而 select 是基于轮询机制。
C. epoll 支持水平触发和边沿触发两种模式。
D. select 能并行支持 I/O 比较小,且无法修改。
出题人:阿里巴巴出题专家:寈峰/阿里技术专家
参考答案:A,B,C
【延伸】那在高并发的访问下,epoll 使用那一种触发方式要高效些?当使用边缘触发的时候要注意些什么东西?
1.1.6 从 innodb 的索引结构分析,为什么索引的 key 长度不能太长
1.1.7 MySQL 的数据如何恢复到任意时间点?
.....
华为篇(共计 50 题)
2.1.0 static 有什么用途?(请至少说明两种)
2.1.1 引用与指针有什么区别?
2.1.2 描述实时系统的基本特性
……百度篇(共计 48 题)
3.1.0 在函数内定义一个字符数组,用 gets 函数输入字符串的时候,如果输入越界,为什么程序会崩溃?
3.1.1 C++中引用与指针的区别
3.1.2 C/C++程序的内存分区
……
腾讯篇(共计 82 题)
Java 基础
4.1.0 JAVA 中的几种基本数据类型是什么,各自占用多少字节。
4.1.1 String 类能被继承吗,为什么。
4.1.2 String,Stringbuffer,StringBuilder 的区别。
4.1.3 ArrayList 和 LinkedList 有什么区别。
JVM
4.4.2 什么情况下会发生栈内存溢出。
4.4.3 JVM 的内存结构,Eden 和 Survivor 比例。
4.4.4 JVM 内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为 Eden 和 Survivor。
开源框架
4.5.5 简单讲讲 tomcat 结构,以及其类加载器流程,线程模型等。
4.5.6 tomcat 如何调优,涉及哪些参数 。
4.5.7 ……
美团篇(共计 40 题)
5.1.0 java 虚拟机内存模型
5.1.1 内存溢出一般发生在哪个区?永久代会不会导致内存溢出?
5.1.2 动态加载类的框架了解哪些?
5.1.3 ……
头条篇(共计 37 题)
6.1.0 5 个人去一个海岛寻宝,最后一共找到了 100 枚金币。他们约定了一个分配方案。
6.1.1 给你一个有序整数数组,数组中的数可以是正数、负数、零,请实现一个函数,这个函数返回一个整数:返回这个数组所有数的平方值中有多少种不同的取值。
6.1.2 一个环有 10 个节点,编号 0-9。从 0 点出发,走 N 步又能回到 0 点,共有多少种走法?
6.1.3 ……
滴滴篇(共计 12 题)
7.1.0 B+树、B-树的区别?
7.1.1 数据库隔离级别,幻读和不可重复读的区别?
7.1.2 有 hell, well, hello, world 等字符串组,现在问能否拼接成 helloworld,代码实现。
7.1.3 ……
京东篇(共计 13 题)
8.1.0 一般 sql 注入怎么发现触点的,从源码阐述 sqlmap 如何测试注入点的。
8.1.1 masscan 扫描端口时靠什么检测,为什么这么快? 请详述.
8.1.2 你写过哪些小工具,你为你使用过的工具做过什么修改.
8.1.3 ……
MySQL 篇(共计 9 题)
9.1.0 主键 超键 候选键 外键
9.1.1 数据库事务的四个特性及含义
9.1.2 视图的作用,视图可以更改么?
9.1.3 ……
Redis 篇(共计 10 题)
10.1.0 使用 Redis 有哪些好处?
参考答案:
(1) 速度快,因为数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是 O(1)
(2) 支持丰富数据类型,支持 string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按 key 设置过期时间,过期后将会自动删除
10.1.1 redis 相比 memcached 有哪些优势?
10.1.2 redis 常见性能问题和解决方案
10.1.3 MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据
……
MongDB 篇(共计 47 题)
11.1.0 什么是 MongoDB?
11.1.1 MongoDB 是由哪种语言写的?
11.1.2 MongoDB 的优势有哪些?
11.1.3 ……
Zookeeper 篇(共计 19 题)
12.1.0 zookeeper 是什么?
12.1.1 zookeeper 提供了什么?
12.1.2 zookeeper 文件系统
12.1.3 ……
Nginx 篇(共计 20 题)
13.1.0 请解释一下什么是 Nginx?
13.1.1 请列举 Nginx 的一些特性?
13.1.2 请列举 Nginx 和 Apache 之间的不同点?
13.1.3 ……
(以下内容持续补全中……)
算法篇
内存篇
cpu 篇
评论