微软(苏)online面经

这周一(2015年1月19日)下午三点,进行了微软苏州的online面试。本来抱着打酱油的心态参加的,其实,根本就没想参加,结果,水过了一面,二面和三面。拿到了现场面试的资格。说是水过,不仅有运气的成分在里面,还因为我有个好老公。

一面:

面试官先让我做一下简短的自我介绍,大概是觉得我说的太罗嗦了,并且又没有任何技术含量,所以就开始问我基础知识。

1.说一说数据库的读写锁。答得应该不太对,面试官无奈,问了下一个问题。

2.看我简历里写熟悉C/C++,说一下C++里的多态吧。依旧答得不好。然后面试官就问我,既然写熟悉C++,那平时都用来干什么。我说平时只用C++做题。做项目没用过。面试官就问我,都做什么题,我充满底气的说“leetcode”。。。本里刷leetcode就属于比较应试,投机取巧的方法,结果被我说的这么理直气壮,面试官也无奈了。就说,那我们做一道leetcode的原题吧。

3.leetcode  [Letter Combinations of a Phone Number] 一道dfs的题。其实,写起来还是没有什么信心的,还是需要再多刷几遍,加深印象。

面试官问了我dfs和bfs的区别,以及使用的数据结构。还有,将char型数字转换成int型数字,需要减去48.我竟然说这是“a”的ascii码。。。。sb了。

4.给一个句子“this is  hello world” 从句子中找到给定的单词,比如:“is”或“hello world”。必须是独立的单词,“this”中出现的is不算。

这道题,恰好跟头一天看zzz做的在线测试的题一样。那道题是求“<red>aaa<blue>bbb</blue>ccc</red>” 每种颜色的字母有多少个。只需要写一个match函数

bool match(int i,string &s,string &parase)  {... return  (s.substr(i,parase.length()) == parase...}。。。。。。。。。i += parase.size()-1;

需要注意的就是边界处理。

二面:

也是简单的自我介绍,讲到代码生成器的项目时,他问我,为什么不用自带的解析方法?大概是这个意思吧,我也没听懂,我只能说,我也不知道。。。然后面试官就特鄙视的笑了。

二面的面试官开始就问我一面有没有写代码,我说有。他说,那好我现在给你出一道题。

1.A={1 3 5 6 8 9 10 14 15 } 数组A从中间任意位置将其分成两部分:L:1 3 5 6 8 ,R:15 14 10 9(将后半部分逆序)。然后将L和R按照目前的自己的顺序混合,生成新的数组newA={15  1 3 14 10 5 9 6 8},要求在O(n)的时间,将newA重新排号升序。

L:1    3   5  6 8

R:15 14 10 9

观察发现R[3]=9一定大于L中的元素,及newA最后一个元素一定<=9。所以,从头开始遍历,跟newA[len-1]比较,如果newA[0]<newA[len-1]则将其放在result开头,否则放于result的尾部。

vector<int> func(vector<int> &input){
    vector<int> result(input.size()) ;
    int p1 = 0, p2 = input.size() - 1; 
    for(auto x : input) {
      if (x <= input.back()) result[p1 ++] = x;
      else result[p2 --] = x;
    }
    return result
}

  2.leetcode [Remove Duplicates from Sorted List II]  链表题

      3.如果要给一个1T的文件排序,但是内存只有1G。怎么处理? 我的解法是分成小块后将小块排序,然后在对这些小块用堆排序。用最小堆就可以排好序。面试官问了好多有关堆排序的细节,最后看我都答上了,就放弃了。

三面:

三面是个女面试官,上来就用英语问我“What's your strength and weakness”。我就懵了,以为三面是hr面呢。。。用中文蹩脚的应付的回答了几个问题,就开始做题了。

1.做一个随机数的生成器。给你一个能随机生成0和1,且0,1出现的概率为50%的生成器rand01(),让用rand01()做一个能生成0,1,2,且概率均为1/3的生成器rand012().

解法是调用两次rand01,并且把两次生成的数字转换成10进制。(00,01,10,11)->(0,1,2,3)。如果为3则再调用一次rand012,从而保证了0,1,2出现的概率为1/3.

int rand012() {
   int ret =  rand01() * 2 + rand01();
   if (ret == 3) return rand012();
   return ret;
}

  2.给AB,BA,CD,DE,FS   AB<->BA 互为回文串,求 回文串对。

    先是给出了一个傻逼的O(n2)的解法。调用了stl里的reverse函数,自己参数写错了。关键是面试官不知道stl里有reverse这个方法。。。。然后自己把reverse实现了。

    之后面试官让我优化。我说用哈希表,时间复杂度降为O(1)。但是面试官说这样有额外的空间。换一个。

    我的解法就是先把这个string array排序,然后再二分。

3.问了我singleton,没答上。

4.让我讲一讲static,答得不好。

今天百度第一天入职,好hi。百度好正规。领了好多文具,漂亮的本子和彩色的笔。哈哈哈哈。但是不知道写点啥。

以上。睡觉去了。

R:15 14 10 9

原文地址:https://www.cnblogs.com/grainy/p/4240554.html