数据结构论坛

首页 » 分类 » 常识 » 苏州微软面经
TUhjnbcbe - 2021/1/17 16:36:00

简介,苏州微软,目前已经电话三轮,全过,过了后可以公费去苏州现场面试。(后面补充,可牛逼了,包机票到上海,火车票到苏州,哎,火车票我一直没有去报销,包苏州五星级的凯悦酒店(就算是合作价也要一晚,含自助早餐),结果再一次去了苏州,总共去了三次了--)

比国外Google的面试难度要低一些,或者说,偏重点更不一样。

微软你可以只做一道面试题,思路清晰,完整,边界情况考虑清楚,代码写好就行了。

但是Google是需要你在40分钟内,完美答出两道题目,这就是区别。

另外,苏州微软是用中文的,也是容易了一些的原因——因为用英语你确实脑子转不过来。

另外,面对外企,不得不刷leetcode,很是让人难受--,算法的话推荐以下书籍:

《大话数据结构》适合初学者,先掌握对各个数据结构与算法的概念,以及自己尝试实现一遍。

《算法导论》,个人推荐像查字典一样用,哪个算法想钻研一下,就只看那章,丰俭由人:理解的之后,剩下就是leetcode了。正文开始:第一轮

没有给出题目,口头说的,我整理一下:

判断一个数组是否基本有序,其实就是可否通过一次简单的交换就满足有序。

例子:

?1,2,3,6,5,12是基本有序数组,因为可以交换6跟5,变成1,2,3,5,6,12?1,5,4,3,6也是基本有序数组,可以交换5跟3?3,2,1,0就不是基本有序数组了,因为你交换一次数组并不能使此数组有序。

思路不难,仔细分析一下,有序的数组数字关系是这样:abcde,而基本有序则是:abcde,这样可能不好看,简单来说就是那两个数字在是不满足xy的关系的。

可以遍历此数组,只要有多于一个数字是比两边都要大,且有一个数字是比左右两边要小的,那就是基本有序数组,其余的都不是。当然,你也要考虑本来这个数组就是有序的情况。

在面试时写的代码与交流草稿如下,这份代码是不能当答案看的,只是让朋友你们看看怎么样的代码可以过面试。建议你们自己写写可以编译过的代码。

intarray1,2,3,6,5,12trueimin:3,miax:51,5,4,3,6subarray-reverse-true1,2,3,6,_5,1,5,4,3,6max:5min:31minmaxleasti,1,5,4,2,8,19,7,,4,9min:2max:5subarray-sorted?73i:2,1,2,3,8,7,6,5,12boolis_almost_sorted_array(vectorinta){intmem_l;boolflag=false;intl_idx=-1,r_idx=-1;On(msub_arry)for(inti=0;ia.size()-1;i++){//subarrayif(aa[i+1]){intmem_l=i;intsub_min=a[mem_l];if(mem_l+1a.size())sub_min=a[mem_l+1];while(ia.size()aa[i+1]){if(flag==true)returnfalse;i++;}/*1,2,7,4,5,6,3,8*//*i:3,-,*i:6,**/intsub_max=a[i-1];if(l_idx==-1i-mem_l==1){//onlyonel_idx=i-1;}elseif(r_idx==-1i-mem_l==1){r_idx=i;if(a[r_idx]a[l_idx-1]a[r_idx]a[l_idx+1]a[l_idx]a[r_idx-1](r_idx==a.size()

a[l_idx]a[r_idx+1]))flag=true;elsereturnfalse;}else{flag=true;//HaveChangedOnceif(sub_min=a[mem_l]

i==a.size()

sub_max=a)returnfalse;}}}returntrue;}testcase:1,2,3=3,2,1=i:0,a[0]a[1],mem_l:0,sub_min:2,subm:3i:1,sub_min:a[2]vs3,13i:2,1=1,3=

面试反馈就是对边界情况考虑不周全,可以多加强。(是的,如上的一些判断语句是跟面试官一起过了一遍才加上的)。

第二轮

第二轮面试官是贴了题目,顺道解释了一下,在这里锻炼你们的英语能力,我就不给你们解释了。

Splitastringintosub-strings.Eachsub-stringshouldbenolongerthanthegivenlimit.TheinputstringcontainsEnglishlettersandspacesonly.Donotbreakawordintotwosubstrings.Removeallspacesinthebeginningorendofeverysubstring.Extend:appendnotationsuchas"(1of12)"andstringsarenotlongerthanthelimitevenafterthenotation.Lengthlimit:39.Input:ThequickbrownfoxjumpsoveralazydogThequickbrownfoxjumpsoveralazydogThequickbrownfoxjumpsoveralazydogThequickbrownfoxjumpsoveralazydogThequickbrownfoxjumpsoveralazydogThequickbrownfoxjumpsoveralazydogThequickbrownfoxjumpsoveralazydogThequickbrownfoxjumpsoveralazydogThequickbrownfoxjumpsoveralazydogResultshouldbe:Thequickbrownfoxjumps(1of14)overalazydogThequick(2of14)brownfoxjumpsoveralazy(3of14)dogThequickbrownfoxjumps(4of14)overalazydogThequick(5of14)brownfoxjumpsoveralazy(6of14)dogThequickbrownfoxjumps(7of14)overalazydogThequick(8of14)brownfoxjumpsoveralazy(9of14)dogThequickbrownfoxjumps(10of14)overalazydogThequick(11of14)brownfoxjumpsoveralazy(12of14)dogThequickbrownfoxjumps(13of14)overalazydog(14of14)

这题我没有正确的思路,因为现在我还没有想出最优解,也没有在网上找到类似的题目,有看过的同学可以分享一下。难点就是,在插入每行附加信息的同时,又不能让这行的字数超出。

我是这样子做的:

每行先不插入信息,先正常的换行,换行完毕后,再递归去插入信息——因为插入信息后会因为行数进位而又需要调整一遍,如99变成.

我写出的代码如下:

vectorstringsplit_sub_strings(stringinput,intlimit){vectorstringres;intcount=0;for(inti=0;iinput.length();++i){intmem_i=i;stringcurrent_line="";while(input!="){i++;}intword_len=i-mem_i;//可以容纳下个词不if(res[count].length()+word_lenlimit){res.push_back(current_line);count++;continue;}else{current_line+=input.splice(mem_i,i);}while(input=="){i++;}}returnupdate_info(res,limit,count);}stringget_apend_info(intcnt,intsum){return"("+to_string(cnt)+"of"to_string(sum)+")"}stringretrieve_back_words(strings){stfor(inti=s.length();s0;s--){}}//backwords://Len35:Thequick(1of14)//overalazydogThequickjumpsbrownfox(2of14)//appendbackworkdsvectorstringupdate_info(vectorstringlist_of_lines,intlimit,intsum){vectorstringres;intcnt=0;stringback_words="";for(autoline:list_of_lines){stringnew_line=line+retrieve_back_words(back_words)+get_apend_info(cnt,sum);if(new_line.length()limit){for(inti=line.length();i0;i--){mem_i=i;while(line!="){line--;}back_words=back_words+line.splice(mem_i,i)+";new_line=line.splice(0,i)+get_apend_info(cnt,sum);if(new_line.length()limit){res.push_back(new_line);}}}}if(back_words.length==0){returnres;}else{sum+=1;res.push_back(retrieve_back_words(back_words)returnupdate_info(res,limit,sum);}}第三轮

这轮是纯英语面试,美国的友人早晨7点打电话来的,对于9点起床的我来说,状态不好。

leetcode原题

1
查看完整版本: 苏州微软面经