微软2013校园招聘笔试题

本文深入探讨了信息技术领域的核心概念,包括但不限于数据库管理、进程间通信、数据结构、算法、设计模式、网络协议等,提供了丰富的实例解析和知识点汇总。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.       数据库

基于某个条件选出一个订单列表,考的是最基本的数据库语言select * from * where *

解: 详见http://blog.youkuaiyun.com/zephyr_be_brave/article/details/9115081

2.       不能用于进程间通信的是

A.      Named event(命名事件)

B.      Named pipe(命名管道)

C.      Critical section( 临界区)

D.      Shared memory(共享内存)

解: C。详见http://blog.youkuaiyun.com/zephyr_be_brave/article/details/8895393

3.        下面哪一种操作不是stack的基本操作?

A.       入栈

B.       出栈

C.       检查是否为空

D.       排序栈中元素

解: D

4.        下面哪一种属于“creational”的设计模式?

A.       Façade

B.       Singleton

C.       Bridge

D.       Composite

E.       上面都不是

解: B。详见http://blog.youkuaiyun.com/zephyr_be_brave/article/details/9115267

5.        当建立连接时,下面哪一个数据包发送顺序是正确的TCP握手协议过程?

A.       SYN,SYN+ACK,SYN+ACK

B.       SYN+ACK,SYN+ACK,SYN

C.       SYN,SYN+ACK,RST

D.       SYN,SYN,ACK

E.       以上都不是

解: 应该是 SYN,ACK+SYN,ACK。详见http://blog.youkuaiyun.com/zephyr_be_brave/article/details/8907750

6.        函数式编程的性质有?(TheCharacteristicsof functional programming are?)

A.       Avoid of changing state and mutable data

B.       Referential transparency

C.       Lambda calculus

D.       Thread-safe

E.       All of Above

解: E。wiki上说,函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念在wiki中,avoids state and mutable data,Lambda calculus,Referential transparency ,Threadsafe都有。

7.        关于HTTP协议说明,哪些是正确的?

A.       在CS模式下,作为一种request-response协议

B.       无状态,对每一个请求看成独立的

C.       WWW和Email使用的协议

D.       HTTP响应包括数字状态码,404经常代表“PageNot Found”

E.       以上都不是

解:A,B,D

Email使用的是STMP协议

HTTP还有一个特性是“无连接”:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

9.        4个袋子,15个球,每个袋子至少放一个球,而且袋子中的球数量不能重复,有多少种方式?

A.       4

B.       5

C.       6

D.       7

解: C.

转化为问题 x1 + x2 + x3 + x4 = 15, x1, x2, x3, x4 >= 1,x4> x3 > x2 > x1。(x1, x2, x3, x4) 一共有多少解。

设x2 = x1 + y1,x3 = x1 + y2,x4 = x1 + y3 => x1 + x2 + x3 + x4 = 15  ,即有
                   4 * x1 = 15 - (y1 + y2 + y3)   (1)
                   y1, y2, y3 >= 1,                     (2)
                   y3 > y2 > y1.                         (3)
=>      x1可以取值:x1 = 1, x1 = 2, 此时
1) x1 = 1时,
y1 + y2 + y3 = 11 
y1, y2, y3 >= 1, 
y3 > y2 > y1.
2) x1 = 2时
y1 + y2 + y3 = 7
y1, y2, y3 >= 1, 
y3 > y2 > y1.
 此时把一个问题分解为两个递归的子问题了。
 如果记f(len, sum) 表示x[0] , x[1], ..., x[len - 1] 的和为sum且满足x[i] >= 1, x[i+ 1] > x[i]的解的个数
 则f(len, sum) = f(len - 1, sum - len) + f(len -1, sum - 2*len) + ...+f(len - k, sum - k * len), sum - k * len >= (1 +2 + 3 +...+(len-2)+ len - 1)

程序如下:

int foo(int len,int sum)
{
	if(len == 1) return 1;
	int remain = len*(len-1)/2;
	int ret = 0;

	while((sum -= len) >= remain)
		ret += foo(len-1,sum);	
	return ret;
}

11.     有两个32bit的数A、B,使用下面方式得到32bit的数C、D。哪一种可以使用C、D得到A、B的值

A.       C=(int32)(A+B),D=(int32)(A-B)

B.       C=(int32)(A+B),D=(int32)((A-B)>>1)

C.       C=(int32)(A+B),D=B

D.       C=(int32)(A+B),D=(int32)(A+2*B)

E.       C=(int32)(A*B),D=(int32)(A/B)

解:举例子用排除法就可以了,32bit和3bit一样道理。设A = 011(3),B = 010(2)。则

A.  C = A+B = 011 + 010 = 101   ;   D = A - B = 001;通过 A = (C+D)/2 = (101+001)/2 = 110/2 = -1,不能正确恢复

B. C = 101 ;D = 000;由于移出的最右一位不知道0还是1,不能正确恢复

C.C = 101,D = 010; A = 101 - 010 = 101 +(-2)补 = 101 + 110 = 011,正确

D. C = 101; D = 011 + 100 = 111 ;通过B = D - C = 111 - 101 = 111 + 011 = 010;  A = C - B = 111 - 010 = 111+110 = 011,为何不正确 ?????

E. 无法确定符号


12.     如果一个二叉树的前序遍历结果是abcdefg,下面哪一个是可能的中序遍历结果?

A.       abcdefg

B.       gfedcba

C.       bcdefga

D.       bceadfg

E.       bcdaefg

解:画一画就出来了ABCE

13.     T(n)=1(n<=1),T(n)=25+T(n/5)+n^2,T(n)复杂度是多少?B

A.       O(nlogn)

B.       O(n^2logn)

C.       O(n^2)

D.       O(n^3)

E.       O(n^3logn)

解:主定理,查一下再做!!!!!!!!!!!!

主要记住nlogba和f(n)的关系,即可,大于为情况1,等于为情况2,小于为情况3.

T(n)=aT(n/b)+f(n)

1) e>0, F(n)=O(nlogba-e),复杂度为T(n)=theta(nlogba):例如T(n)=9T(n/3)+ n, theta(n2)

2) f(n)=theta(nlogba),复杂度为T(n)=theta(nlogba*lgn)。例如:T(n)=25T(n/5)+O(n2),theta(n2lgn)




14.     两个线程运行在双核机器上,每个线程主程序如下,线程1:x=1;r1=y;线程2:y=1;r2=x。x和y是两个全局变量,初始为0。以下哪一个是r1和r2的可能值?ABC

A.       r1=1,r2=1

B.       r1=1,r2=0

C.       r1=0,r2=1

D.       r1=0,r2=0

解: ABC,详见http://blog.youkuaiyun.com/zephyr_be_brave/article/details/9132497


15.     有n个元素的完全二叉树的深度是:

A.       D(n)=log2(n)

B.       D(n)=1+log2(n)

C.       D(n)=n+log2(n)

D.       D(n)=1+n*log2(n)

解:B.普遍来说,认为根结点深度为1,所以深度=1+ log2(n)


16.     在1,2,3,…999,1000这些数中,一共出现了多少个0?

A.       189

B.       191

C.       193

D.       195

解:1~9,0个0;10~99,9个0,1000有3个0。求一下100~999有多少个0即可。

100~999中有两个0的数字有9个;有1个0的数字有:9*9*2。所以共有81*2 + 3 + 9*2 +9= 192个. 


17.     2月28日出生和2月29日出生的人的比例是多少?2012年2月28日和2012年2月29日出生的人的比例是多少?

A.       1:1和1:1

B.       4:1和1:1

C.       1:1和4:1

D.       4:1和4:1

解:B

18.     下面哪些使用的是贪心算法   ABC

A.       单源最短路径中的Dijkstra算法

B.       最小生成树的Prim算法

C.       最小生成树的Kruskal算法

D.       计算每对顶点最短路径的Floyd-Warshall算法   //动态规划

E.       字符串匹配中的KMP算法

解: ABC


19.     给了4个函数,可以看出其中第一个为选择排序,第二个为冒泡排序第三个感觉代码本身就有些问题第四个为快速排序

问哪一个排序能将数组a[5]={{3,4},{6,5},{2,7},{3,1},{1,2}}变为{{1,2},{2,7},{3,1},{3,4},{6,5}}

只比较第一个元素。

比较函数为

 int cmp(A x, A y) {return x.key1-y.key1;)

class A{
public:
     int k1;
     int k2;
};

A.       f1(a,5,cmp)

B.       f2(a,5,cmp)

C.       f3(a,5,cmp)

D.       f4(a,5,cmp)

E.       以上都不对


//////复习各种排序


答案:A,D

这道题出的很有意思,乍一看,题干这么大,可能会被唬住,其实冷静下来看一下,很简单,就是一个排序的稳定性非稳定性的分析。所谓稳定性,即:保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同,如果排序的结点仅仅是一个数,则稳定性意义不大,但是如果有多个键值,就需要考虑稳定性的分析。例如,对于本题,如果排序算法是稳定的,那么因为原数组{3,4}排在{3,1}前,根据稳定性的定义,排序的结果就一定不会出现{3,1}排在{3,4}前的情况。而如果算法是不稳定的,那么只能说,{3,1}有排在{3,4}前面的可能,需要根据具体的排序过程判断是否相等的值会变换位置。关于八种算法稳定性的分析,可以查看http://hi.baidu.com/shismbwb/item/404c94898cfd2855850fab24。选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。

 

所以,首先明确四个函数都采用了什么样的排序算法:

f1:选择排序;f2:直接插入排序;f3:冒泡,f4:快排

f2和f3是稳定的,直接pass掉。然后非稳定的再看是否变换了位置。A和D如果走一遍程序的话,会发现{3,4}和{3,1}这两个元素是变了顺序的。

对于A答案,a[5]={{3,4},{6,5},{2,7},{3,1},{1,2}}

第一遍排序:{{1,2},{6,5},{2,7},{3,1},{3,4}}

第二遍排序:{{1,2},{2,7},{6,5},{3,1},{3,4}}

第三遍排序:{{1,2},{2,7},{3,1},{6,5},{3,4}}

第四遍排序:{{1,2},{2,7},{3,1},{3,4},{6,5}}

所以正确

对于D答案,a[5]={{3,4},{6,5},{2,7},{3,1},{1,2}}

第一遍排序的运行过程是这样的。

初始:low=0,high=4,i=0,t={3,4}

For循环:

J=1, c({6,5},t)>0,i=0,没有交换(a[i],a[j]),{{3,4},{6,5},{2,7},{3,1},{1,2}}

J=2,c({2,7},t)<0,i=1,交换({6,5},{2,7}),{{3,4},{2,7},{6,5},{3,1},{1,2}}

J=3, c({3,1},t)=0,i=2,交换({6,5},{3,1}),{{3,4},{2,7},{3,1},{6,5},{1,2}}

J=4, c({1,2},t)<0,i=3,交换({6,5},{1,2}),{{3,4},{2,7},{3,1},{1,2},{6,5}}

最后,执行exchange(a,low,i), 交换({3,4},{1,2}),{{1,2},{2,7},{3,1},{3,4},{6,5}}

得到第一遍排序结果:{{1,2},{2,7},{3,1},{3,4},{6,5}},找到了{3,1}的位置,已经在{3,4}的前面,所以最后的结果一定与预期结果相同。这里需要非常注意的是在_f41函数中,if(c(a[j],t)<=0),如果写成c(a[j],t)<0的话,则该答案也不会选择。所以最终的答案是A和D


选择排序, 此题代码是选择的最小出列。选出最小的与前面的交换,其条件是cmp<0, 显然第一趟(3,4)(1,2)交换后到了(3,1)的后面然后是(6,5)(2,7)交换,其条件是cmp<0,所以(6,5)(3,1 )交换,最后的输出结果满足题目要求

冒泡排序 其条件是cmp<0,显然(3,4)不可能会与(3,1)交换,因此不符合题目要求

快速排序时不稳定排序,不能保证谁在谁前面,快排的条件是cmp<=0且其哨兵都是选择序列中的第一个作为哨兵,结合本题所给的数组a,结果是与题目相符


20.      

<word>:: <letter>|<letter><pairlet>|<letter><pairdig>

<pairlet>:: <letter><letter>|<pairlet><letter><letter>

<pairdig>::<digit><digit>|<pairdig><digit><digit>

<letter>::a|b|c|…|y|z

<digit>::0|1|2|…|9

下面哪一个词可以从<word>的规则中产生?

I. abcd    II. bcdef III. d22

A.       都不是

B.       只有I和II

C.       只有I和III

D.       只有II和III

E.       I和II和III都是

答案:D

算是一道考察形式自动机的题。关键是分析清楚每种模式本质上代表什么。<letter>表示单个字母;<digit>表示单个数字;<pairdig>是两个<digit>,或者递归<pairdig>和两个<digit>,其实表示的是偶数个<digit>,即偶数个数字;同理,<pairlet>是偶数个字母。所以<word>的可能是:1个字母,奇数个字母,或者一个字母和偶数个数字。所以第二个和第三个是正确的。


21.下面程序的输出结果

#include <iostream>
using namespace std;

class Base
{
public:
    char Value() { return 'A';}
    virtual char VirtualValue() { return 'X';}
};

class Derived:public Base
{
public:
    char Value(){return'U';}
};

class VirtualDerived:virtual public Base
{
public:
    char Value() { return 'Z';}
    char VirtualValue() { return 'V';}
};

void main()
{
    Base *p1=new Derived();
    Base *p2=new VirtualDerived();
    cout<<p1->Value()<<" "<<
    p1->VirtualValue()<<" "<<
    p2->Value()<<" "<<
    p2->VirtualValue()<<endl;
}

解:AXAV。用Base的指针调用,所以只有虚函数会调用子类本身的。


22.shallow copying (浅拷贝)的特征

解:详见
http://blog.youkuaiyun.com/zephyr_be_brave/article/details/9149129


内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值