今天,约了微软的面试,连续三轮,每轮1个小时,从下午2点持续到下午5点。虽然感觉自己最后一轮回答的非常烂,但是还是把面试过程分享出来,给大家一些参考吧
第一轮:自我介绍+项目介绍
开始做题: 合并k个链表
解题思路:两两合并(考查分治方法)
第二轮:自我介绍+项目介绍
开始做题: 1. 如何判断一颗平衡树 2. 颜色分类(0,1,2按序排列)
题1解题思路:采用递归,判断子树是否是一颗平衡树(如果是,返回子树高度;如果不是返回-1)
题2解题思路:LeetCode原题,采用双指针
第三轮:自我介绍+项目介绍
开始做题: 1. 实现单例模式 2. String转数字,若存在特殊字符,返回null, 否则返回数字(考虑正负情况)
题1解题思路:使用静态内置类实现单例模式(饿汉模式)
public class Singleton { //可通过类来获取静态变量
private static Singleton instance = new Singleton(); //初始化自动创建实例,static和private修饰
private Singleton (){} //避免构造函数
public static Singleton getInstance() { //获取实例方法,public公开方法,static修饰静态方法
return instance;
}
}
题2解题思路:需要考虑各种特殊情况,主要考察你对问题的考虑是否周到
-
是否为空,或者由空格组成。
-
是否带有正负符号,正号可以忽略,负号在返回结果时需要带上。
-
以0开头,需要跳过连续的前置0。例如"000123",转换的结果是123。
-
超过了Integer的最大边界或最小边界。
-
小数点可以忽略,因为是转成整型,会舍掉小数点后面的数。
-
出现多个正负符号,直接返回0。例如"±2",结果是0。
-
第一位只能是数字(0到9)或者正负符号,出现其他字符直接返回0。
public int myAtoi3(String str) {
if (str == null) {
return 0;
}
str = str.trim();
if (str.isEmpty()) {
return 0;
}
int index = 0, total = 0, n = str.length();
int sign = 1;
// 判断正负
// 只判断一次,不能使用循环
if (index < n && (str.charAt(index) == '+'
|| str.charAt(index) == '-')) {
sign = str.charAt(index) == '-' ? -1 : 1;
index++;
}
// 计算整数
while (index < n) {
int num = str.charAt(index)-'0';
if (num < 0 || num > 9) {
break;
}
// 避免越界
if (total > Integer.MAX_VALUE/10 ||
(total == Integer.MAX_VALUE/10
&& num > Integer.MAX_VALUE%10)) {
return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
total = total*10 + num;
index++;
}
return total*sign;
}