笔试基础
- java中可以有没初始化的变量吗?
类和函数中都可以有;只要在使用前完成初始化即可 - String s;声明没有初始化,可以打印吗?
不行,不管基本类型、还是对象,都需要在使用前初始化 - system.out.println(“5”+2)结果是多少?
52 - 抽象类可以实现方法吗?
抽象类可以实现其中的部分方法 - 抽象方法可以实现吗?
标记了abstract的方法不能被实现!! - 子类对象转换为父类,再转换为子类,可以吗?
可以的,能正常使用 - 类中未初始化的字段默认是?
0/false - XSS攻击是什么?
有整理,详见博客… - 新生代那种情况下回进入老年代?
见博客整理(JVM部分) - 再散列法中,m的范围
0,…m-1 - 子类与父类的关系?
泛化/继承
=> 也称为is a kind of
- String str="我是谁呢! ";则str的长度为?
6,一个汉字通常占2个字节; 而java中char就是2字节的! - shell中if…else的写法
Shell if else语句 => 有then!
面试题
携程一面
5种IO模型,阻塞非阻塞,同步异步
进程间通信
Java线程池
(参数是重点)- java内存模型
hashMap在1.7、1.8中的实现(其中的头插法尾插法)
HashMap并发导致什么问题,举例 => 即为什么线程不安全
?- 垃圾回收(引用计数的问题、可达性分析) => 可以讲的很多,自己回答得很少
- 正向代理、反向代理的区别
- 项目:缓存穿透、缓存雪崩
- 项目:消息队列框架是怎么实现的?消息丢失了怎么办?
为防止丢失,可进行持久化 - 项目:项目中事务怎么处理的?
- 项目:使用RPC有什么用?
- 项目:如何保证订单号的唯一性?
- 总结
第一次面试,感觉对SSM项目不熟悉,Java基础遗忘了很多,语言组织也有问题
携程二面
- 如何解决超卖问题
- 更新缓存失败如何处理
- 系统响应慢如何处理
- redis冷启动如何处理
- MQ阻塞如何处理
- 如何维护订单状态
腾讯电话一面
- 存储引擎,InnoDB/MyISAM区别
- TCP、UDP、HTTP的区别
- TCP三次握手、四次挥手
- 有哪些排序算法,特点
- 项目:ucore
- 总结
讲项目时没有分清重点、主次 =>下次先讲清楚每个lab做了什么
!!!
腾讯二面(挂)
- 项目(做了什么、你认为的难点)
- 进程间通信方式
- 命令行(查看cpu、查看网络)
网易一面
- MyISAM锁与InnoDB锁讲解
- 数据库表查询太慢如何处理
- linux命令
- 数据库死锁如何发现、如何处理
- MySQL的explain命令
使用explain关键字可以模拟优化器执行sql查询语句,从而知道MySQL是如何处理sql语句。explain主要用于分析查询语句或表结构的性能瓶颈。
…
网易二面
- 分析父子进程卡住了的问题,联系管道
- HTTP的 Content-length
- HTTP必须使用TCP吗
- HTTP1.1流水线发送,可以后发的先收到吗
- 红黑树
- 为什么数据库使用B+树而不是红黑树
- MySQL连接资源耗光了怎么排查
- MySQL死锁怎么解决
- 同一个页面,不用人看到不同数据,如何实现?
- 缓存穿透如何处理
猿辅导一面(挂)
- 项目…
- 写后读问题
- httpclient与RPC的区别
- 使用MVC有什么优点
…
美团一面(挂)
- 深克隆/浅克隆,深克隆在并发场景的风险?
- SQL写连接=> 不会写!
- 泛型的使用场景
- ConcurrentModificationException异常什么时候出现
- 为什么重写了equals方法要重写hashCode方法?
- String、StringBuilder、StringBuilder的区别
String、StringBuffer与StringBuilder之间区别 - hashMap线程安全问题
- 数据库隔离级别
- 为什么MySQL默认为REATPEATABLE-READ?
- B+树,为什么要用B+树做索引?
腾讯一面
- 全是ucore项目细节…
腾讯二面
- ucore细节……
字节一面
- MySQL复制方式?
- SSO怎么做的?
- 关于RPC、Solr等细节 => 不会
- Nginx进程模型、IO模型
- 倒排索引、正排索引
- 下单、扣库存怎么做?
- 有遇到超卖问题吗?
- 缓存用到哪些地方
- malloc与kmalloc
- RCU
- HTTP1.0/1.1/2
- ucore与操作系统……
字节二三面
……
华为一面
- 类中只有char a; int b; 两个成员,求对象的sizeof()
8,因为通常使用了四字节对齐! - 如下题
最终打印的是多少(面试时答错了)。 => 因为b这个指针最终是被视为char类型的,所以最终取到的仅是a低地址,通常小端模式下低字节存在低地址,所以打印的应该是78int a=12345678; char* b=(char *)&a; printf("%d\n",*b);
招银网络一面
- 构造函数能作为虚函数吗
假设构造函数是虚的。就须要通过 vtable来调用。但是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。实际上,vtable在构造函数调用后才建立,因而构造函数不可能成为虚函数
- SQL取第k大的数
暂时参考:MySQL_ mysql 不用 order by 实现 第K大 功能
撕题
春招实习 ——————————————————————————————————————————————————
- 股票交易问题(富途笔试)
- 爬楼梯(携程一面)
100级楼梯,每次可以走1或者2步,问一共有多少种走法?
=> 递归/动态规划 - 生成随机数(携程一面,没答上来)
问:给定两个[0-5]的随机数,如何生成一个[0-8]的随机数?
=> 方法是拒绝抽样
:470. 用 Rand7() 实现 Rand10() - 子集问题(网易笔试)
用的回溯法时间超限了 => 直接穷举或者增量穷举可以吗?
求解幂集问题 - 满减优惠(网易笔试)
容易想到暴力计算,遍历所有组合可能 => 但是超时
应该是动态规划 =>0-1背包问题
!
参考:促销中“满X优惠”问题的两种解法:动态规划和枚举法 - flood fill算法(京东笔试)
733. 图像渲染
类似的题有:200. 岛屿数量 => DFS、并查集等都可解决… - 最长公共连续子串(美团面试)
参考:最长公共连续子串 - 全排列问题(猿辅导一面)
回溯法即可…尽然当场没写出来! - 字符串翻转(腾讯一面)
算法很简单,但是用C语言写,需要注意:
1.char* str=“hello world good”; 是常量不能修改!
2.修改后,末尾记得加上’\0’; - 股票买卖问题(字节一面)
一次交易、两次交易、不限交易次数……
121. 买卖股票的最佳时机
秋招 ————————————————————————————————————————————
- 动态规划(笔试)
长度的n的字符串,只有a、b两种字符,且不能出现aba、bab两个子串。问这样的字符串一共有多少个
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 50;
const LL MOD = 998244353;
LL dp[N][2][2];//dp[i][j][k] 表示前i个字符 倒数第二个是j,倒数第一个是k的方案数。0表示a,1表示b
int main() {
int n; cin >> n;
if(n <= 3) {
cout <<n * 2;
return 0;
}
dp[3][0][0] = dp[3][1][1] = 2;
dp[3][0][1] = dp[3][1][0] = 1;
for(int i = 4; i <= n; i++) {
dp[i][0][0] = (dp[i-1][0][0] + dp[i-1][1][0]) % MOD;
dp[i][0][1] = dp[i-1][0][0];
dp[i][1][0] = dp[i-1][1][1];
dp[i][1][1] = (dp[i-1][0][1] + dp[i-1][1][1]) % MOD;
}
LL ans = 0;
for(int i = 0; i < 2; i++){
for(int j = 0; j < 2; j++) {
ans += dp[n][i][j];
ans %=MOD;
}
}
cout << ans;
return 0;
}
// 易错解法 => 这种解法时,考虑倒数第二个字符的时候漏掉了对倒数第三个字符的限制,故结果偏大
int solve1(int n){
vector<int> dpa(n); // str[i]为a,且满足条件的个数
vector<int> dpb(n); // str[i]为b,且满足条件的个数
dpa[0]=1; dpa[1]=2;
dpa[0]=1; dpb[1]=2;
for(int i=2;i<n;i++){
dpa[i]=(dpa[i-1]+dpa[i-2])+(dpa[i-1]+dpb[i-2])+(dpb[i-1]+dpb[i-2]); // aaa、baa、bba
dpb[i]=(dpb[i-1]+dpb[i-2])+(dpa[i-1]+dpa[i-2])+(dpb[i-1]+dpa[i-2]); // bbb、aab、abb
}
return min(dpa[n-1],dpb[n-1]);
}
另外,有题友说是斐波那契数列,暂时没分析出来……
-
最短路径(笔试)
题目忘了,但是显然是最短路径题目,且是多源最短路径,可使用Floyd算法(dijkstra执行n次亦可)
可参考:743. 网络延迟时间 -
思路分析型(笔试)
只有字符a和c组成的字符串,通过交换相邻的两个元素,最终使得所有a连在一起,所有c连在一起。最少交换多少次
比如: acca => 2次 ; 变为ccaa
分析:其实最终变为ccccc…aaaaa 即可。对于每个a,最终它后面的c是都要到它前面的,所以其实统计每个a后面的c个数之和即可(笔试时为何没有想到!!!)
for(int i=n-1;i>=0;i--){
if(s[i]=='c') cnt_c++; //num表示c的个数
else sum+=cnt_c; //sum表示移动次数
}
-
滑动窗口最大值(笔试)
题目记不住了,大概是这么个思路,参考:239. 滑动窗口最大值 -
堆(以及BFS的思路,重要!)
题目:两个数组,从每个数组中取一个数相加,求最小的前k个和
。
面试时想到了取最小和之后要判断下一个最小和是哪个,但是却忽略了BFS的思路!因为下一个最小和下一个最小和,可能下一个次小和的下一个最小和更大! 所以必须要使用BFS+优先队列,而不能直接往下每次都取最小和……
参考:【C++】【手撕】【top K】两个有序数组间相加和的Topk问题;优先队列、最大堆 -
子串问题
题目:给定一个长为n的01串,求最大的子串长度,其中子串的01个数相等。如01100010,最长01串就是110001,输出6。// 由于只有0、1,使用cnt记录1的个数,遇到0则抵消,当cnt为0时,说明构成了一个连续且01个数相等的子串(其实有点类似于摩尔投票) int maxChildSeq(vector<int> nums){ int maxLen=0; int n=nums.size(); for(int i=0;i<n;i++){ int cnt=0; for(int j=i;j<n;j++){ if(nums[j]==1) cnt++; else cnt--; if(cnt==0) maxLen=max(maxLen,j-i+1); } } return maxLen; }
-
数学推理
题目:给定n个路灯,编号i从1到n,初始的时候路灯都是关着的。有n个时刻,t从1到n,在每个时刻t,我们会把编号为t的倍数的路灯状态进行改变(关闭变成开启、开启变成关闭)。求在时刻n结束后,有多少路灯是开着的。
解:分别对每个路灯进行研究 => 在n个时刻内,编号为i的路灯被打开、关闭的次数如何计算? => 当i模上t为0时,则会被打开/关闭 => 当i模t为0的次数为奇数时,则灯i最终是开着的 => 即当i的因子个数为奇数时,灯i最终是开着的 =>当i是整数的平方时,i的因子个数为奇数
(经面试官引导,归纳出来的) ……int solve(int n){ int cnt=0; for(int i=1;i*i<=n;i++){ cnt++; } return cnt; }