1.17一面
上来面试官没有让自我介绍,直接甩题
LC 1087 花括号展开
我们用一个特殊的字符串 S 来表示一份单词列表,之所以能展开成为一个列表,是因为这个字符串 S 中存在一个叫做「选项」的概念:
单词中的每个字母可能只有一个选项或存在多个备选项。如果只有一个选项,那么该字母按原样表示。
如果存在多个选项,就会以花括号包裹来表示这些选项(使它们与其他字母分隔开),例如 "{a,b,c}" 表示 ["a", "b", "c"]。
示例
输入: "{a,b}c{d,e}f"
输出: ["acdf","acef","bcdf","bcef"]
贴一个Java题解。
public String[] expand(String s){
if(s==null||s.length()==0)
return new String[0];
List<String> res=new ArrayList<>();
dfs(s,0,new StringBuilder(),res);
Collections.sort(res);
return res.toArray(new String[0]);
}
public void dfs(String s,int i,StringBuilder sb,List<String> res){
if(i>=s.length()){
res.add(sb.toString());
return;
}
if(s.charAt(i)=='{'){
int j=i+1;
while(j<s.length()&&s.charAt(j)!='}')
j++;
String[] candidates=s.substring(i+1,j).split(",");
for(String candidate:candidates){
sb.append(candidate);
dfs(s,j+1,sb,res);
sb.deleteCharAt(sb.length()-1);
}
}else {
sb.append(s.charAt(i));
dfs(s,i+1,sb,res);
sb.deleteCharAt(sb.length()-1);
}
}
可能是因为第一次面试吧,表现实在太拉了,拉到底了真的,全程就是50分钟敲一道算法题而且没敲出来,没敲出来也没和思路卡了也没和面试官交流,十分尴尬,自己钻牛角尖,复盘的时候真的感觉自己像个sb,面试官小哥真的很好,我表现这样都能坚持着面完我,后面还很耐心很真诚的回答了我的问题真的十分感激。算法掌握的也不够好很有问题,任重而道远,其实都没想到投微软暑期实习提前批简历会给我过,给我这次机会已经很满足了,希望二面的自己能比这次好一点,吸取教训。切忌面试官给你算法题自己闷头敲,一定要和面试官多交流。面试即将结束的时候我问面试官建议,面试官说工作和平常自己敲代码很不一样,工作很看重交流协作能力,面试中给我一道算法题,并不是让我一个人解决掉这个问题,而是两个人一起交流思路看法,当然思考主要是我自己,遇到某些问题卡了,要和面试官交流而不是自己一个人闷着头解决。这是我这场面试中学到的,还有就是语言一定要组织好,面试的时候我自己都想给自己嘴巴子,讲的都是些什么玩意,一点也不清晰。另外就是面试结尾提问环节,一定要自己提前想好,列好问题,要不然很容易表达不出自己想要表达的意思,甚至冒犯到面试官,我自己就是活生生的例子。只能说吸取教训好好努力吧,春招加油。太感激微软AB面这个制度了,面试一次真的让我学到了好多,成长了不少,即使表现得很差也能经历两次面试帮助我成长真的太棒了。继续加油,微软是我DreamCompany.
1.19二面
上来首先做个自我介绍,然后根据简历问了Java高并发的问题,因为没想到会问这些,以为只问算法回答的稀碎,已经将近一个月没有看过相关的知识了,忘的大差不差,稀碎。如果一个问题一个问题问可能也不会有太大问题,关键是面试官问的比较开放,直接想让我总结整个Java高并发知识体系架构,给我整不会了,大脑一片空白,因此给了我一个教训,以后在看书学习的时候不仅仅要对单个知识点的掌握,同时也要注意对整个知识体系架构的总结,不要背书,要理解,把握整体,所有的知识都是这样,Java基础,计网,操作系统,MySQL,Redis等等都是同样的道理,要注重知识体系的把握,这样当面试官问的比较开放的时候不会没东西答。
然后让做了一道算法题
LC43字符串相乘,按道理应该直接秒的。。之前也做过,但是面试的时候可能紧张或者什么原因,做的很卡,面试官也说我太紧张了,本来这道题难度并不高的但是做的并不是很好。。然后这道题我之前也刷过。主要就是当时觉得很简单直接上手就写了,结果没想到会出问题。给自己心态整崩了。因此以后刷题要养成习惯,首先要自己在纸上画一画,设计一下思路,都需要用到哪些变量,需要设计哪些方法,想好之后再下笔,刷每道题都需要养成这样的习惯,这样面试的时候才不会慌,面试的时候真的会做不出来平常随便写的题。。
贴一下题解,就是模拟竖式乘法一位一位算就好了,很简单。。
class Solution {
public String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
int m = num1.length(), n = num2.length();
int[] ansArr = new int[m + n];
for (int i = m - 1; i >= 0; i--) {
int x = num1.charAt(i) - '0';
for (int j = n - 1; j >= 0; j--) {
int y = num2.charAt(j) - '0';
ansArr[i + j + 1] += x * y;
}
}
for (int i = m + n - 1; i > 0; i--) {
ansArr[i - 1] += ansArr[i] / 10;
ansArr[i] %= 10;
}
int index = ansArr[0] == 0 ? 1 : 0;
StringBuffer ans = new StringBuffer();
while (index < m + n) {
ans.append(ansArr[index]);
index++;
}
return ans.toString();
}
}
总结一下这次面试吧。。面试官都很好,都很坦诚,给的建议也都很好,第一次面试虽然结果是预想的到的但是因为特别想进微软还是会很沮丧,可能以后挂多了就好了吧哈哈哈,结果可能并不那么重要,重要的是修正自己今后的学习方向,总结经验,发现自己的问题。面试官给我的建议就是要熟悉自己的简历,多刷刷题,不要紧张,二面面试官知道我是第一次面试最后给了我很多建议真的太棒了哈哈哈哈,加油!!!