微软面经(结合Leetcode讲解)真题实战.md

话说博客是纯讨论技术,没啥访问量啊,好吧,来个大家比较感兴趣的,面经!

渠道

近期某厂跟随互联网寒冬的潮流,“组织架构调整”,于是有相与的同事拉了个求职群,很快加满了XXX人,受众有了,于是也吸引了不少其他厂的HR来捞人,包括微软(但是刚开始没有岗位,只是投递简历后的例行联系);
其他程序员可能会问,我不在这个群,怎么联系微软HR?程序员论坛上很多微软员工内推的,搜索一下就有,如果各位需要微软HR的联系方式,也可以找我要,微信名片发你。

HR电话

然后是漫长等待,前后有多个HR,主要是等上海Azure的java出来HC

电话面试

6月14日进行的电话面试,我的失误:没有提前准备好环境,对方要求用Microsoft Skype Interview (不需要视频,主要是用其中的白板,演示和代码功能),我在mac上安装了Skype普通客户端,但是不知道这个其实不能用,主要是Chrome安装好就行(而且安装好后刚开始还连接不上),大概浪费了约10多分钟时间。。

项目经验部分

  1. 我的经历介绍,前几家工作过的公司,各个项目,重点介绍了网易圈圈项目,分为社交和金融2部分

  2. 金融部分架构图手画,性能优化,企业账户余额异步处理,面试官提了些问题,深度是外企普通深度,比如对余额为负问题没有问到(少部分我面试过的其他外企有问到)

  3. 技术栈,谈到了nginx,springboot,mysql,redis,kafka

coding部分

融入了微软的一些场景,出了一个连续数中搜索的相关的问题,事后我检查Leetcode,发现和有道原题相似。
Leetcode原题53 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

如下是naive解法,我的习惯是,如果一瞬间没有想到很好的解法,可以先用naive方法解出。其实还可以滑动窗口(左滑右滑问题我一时没有想好,没有解决一个关键算法问题,心痛!


//整数序列 和最大的subsequence(连续)
class HelloWorld {
private List maxSubsequence(int[] source) {
//naive 分拆子序列,求其最大值
int len = source.length;
int level = 1;
List> lists = new ArrayList<>();
while (level <= len) {
for (int i=0; i list = new ArrayList<>();
for (int j=i; j result;
for (List item : lists) {
int sum = 0;
for (Integer tmp : item) {
sum += tmp;
}
if (sum > max) {
max = sum;
result = item;
}
}
return result;
}

    public static void main(String args[]) {
        System.out.println("Hello world - Java!");
    }
}

这道题我自己都觉得解决地不利索,后来用没有提前准备好环境,心理有点慌来安慰自己。但是发现有Leetcode原题比较相似后,我觉得不对啊,我是做过这题的啊,(我在leetcode上已经刷过200+以上的题目了)
后来我发现我之前只实现了naive暴力法!之前我刷题求速度,没有仔细对比各种实现的异同,后者才是leetcode精华的部分,单纯求速度,KPI思想毒害不浅,出来混,要还的。。
如下是我几个月前解原题的代码,可以看出当时想到了比较glace的解法,但是因为比较花时间没有真正实现,用暴力法解决通过测试就拉到了


class Solution {
    public int maxSubArray(int[] nums) {
        //滑动窗口法,如果和在变大,继续右边滑1位;如果和反而变小了,左边滑1位--后来发现这思路有问题
        //还是暴力法。。加个辅助数组逐个计算 O(n平方) 最后遍历一下这个辅助数组,找到最大的就可以了
        if (nums == null || nums.length==0) return 0;
        if (nums.length == 1) return nums[0];
        int len = nums.length;
        int[] t = new int[len];
        for (int i=0; i maxsum) maxsum = prevsum;
            }
            t[i] = maxsum;
        }
        int max = -1000000;
        for (int i=0; i max) max = t[i];
        }
        return max;

    }
}

后来用了网上大牛的方法,这个方法比较取巧,找到题目规律,实现了比较优雅的算法


    public int maxSubArray(int[] nums) {
        int res = nums[0];
        int sum = 0;
        for (int num: nums) {
            if (sum > 0) {
                sum += num;
            } else {
                sum = num;
            }
            res = Math.max(res, sum);
        }
        return res;
    }

//如果改写为微软题目要求

    public List maxSubArray(int[] nums) {

        List res = new ArrayList<>();

        int sum = 0;

        List curr = new ArrayList<>();

        for (int num: nums) {

            if (sum > 0) {
                sum += num;

                curr.add(num);
            } else {
                sum = num;

                curr.removeAll();

                curr.add(num);
            }
            if (sum(res) < sum(curr)) 克隆curr到res;  //假设sum<=0,那么后面的子序列肯定不包含目前的子序列,所以令sum = num;如果sum > 0对于后面的子序列是有好处的。res = Math.max(res, sum)保证可以找到最大的子序和


        }
        return res;
    }

结果效率提升极大!!!!!!!!!:
如下是对比,执行时间提升了100倍

微软面经(结合Leetcode讲解)真题实战.md_第1张图片

你可能感兴趣的:(Java)