微软笔试和面试题

来源:互联网 发布:js字符串反转函数 编辑:程序博客网 时间:2024/04/30 06:12
        1.链表和数组的区别在哪里?
  2.编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?
  3.编写实现数组排序的一种算法。说明为什么你会选择用这样的方法?
  4.请编写能直接实现strstr()函数功能的代码。
  5.编写反转字符串的程序,要求优化速度、优化空间。
  6.在链表里如何发现循环链接?
  7.给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。
  8.写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)
  9.给出一个函数来输出一个字符串的所有排列。
  10.请编写实现malloc()内存分配函数功能一样的代码。
  11.给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。
  12.怎样编写一个程序,把一个有序整数数组放到二叉树中?
  13.怎样从顶部开始逐层打印二叉树结点数据?请编程。
  14.怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?

1 查找字符串str中有多少个指定的子串str1
2 统计给定文本的单词个数
3 在一篇文档里找出某字符串的所有行号和个数
4 写一函数,检测一个字符串是否有一个回环串?(比如abcdedcba)
5 写函书判断一个链表是否为循环链表
还有的忘了
题目都不是很难,但是我感觉很紧张,其实面世的问题也不难,主要是什么方面都涉及到一些,网络,数据库,开发工具,当然都是侧重于微软的产品,比如com+ .net hooking 等,
网络方面的是网络负载平衡,以及实现。另一个问题是怎么使msn不修改代理越过防火墙
数据库就是问sql server的问题:sql server的配置管理 安全机制,触发器和存储过程的编写
测试技术:怎么测试你刚才写的函数?常用的测试工具 怎么测试ATM机

等等一些问题,考官先问你对这些方面的了解程度,然后一层层深入问下去,你要是说不回不了解,他就不会再问了,转而问下一个方面的问题

 

1、1000!有几位数,为什么  

    2、F(n)=1 n>8 n<12

    F(n)=2 n<2

    F(n)=3 n=6

    F(n)=4 n=other  

    使用+ - * /和sign(n)函数组合出F(n)函数

    sign(n)=0 n=0

    sign(n)=-1 n<0

    sign(n)=1 n>0   

    3、编一个程序求质数的和例如F(7)=1+3+5+7+11+13+17=58 


 

前天微软亚洲工程院全国第一轮笔试,西安考区的,安排在西电,人挺多,不过应该不到一千吧。

15页考卷,分为AB卷,要求是三个小时考完,全部用铅笔答题。中途不允许去WC,PS:全英文考题。总体来说还是很基础的,算法与数据结构的比较多,还有一些推理题目,不过这次的不难(条件环节不够多)。当然少不了编程的题目不过这些题目主要是考你对程序的理解与习惯。


都过了一夜睡了一觉,题目不记得多少了,就记得几个自己印象深刻点儿,遗憾才深刻....

I Basic
这个部分有近二十道多项选择题和若干填空题,内容繁多零散,大部分是关于数据结构和c/c++语言,还有关于软件工程,测试方法,无状态网络的一些题目;填空题是读程序填结果,当然最后还有一道比较复杂的逻辑题目.

1。regular expression不能描述的是?
a)两个连续偶数
b)两个连续奇数
。。。。

2


int s(int v)
{
     int count=0;
     int x=v;
     while (x)
     {
          count++;
          x=x&(x-1)
     }
     return count;
}

s(9999)=?


3,关于堆排序的东西,插入新的元素以后的结果

4,关于C语言中,.h文件和.c文件之间的关系

5,如果数据扩大两倍,是向左,还是向右移动几位的问题

6,对二叉排序数,以什么输出(前序,中序,还是后续)输出,是排列

7,一个顺序为 1,2,3,4,5,6 的栈,依次进入一个队列,然后再进栈, 顺序是什么?

8 关于数组指针的的题目

9 regular language 和context language之间的关系是什么.
a)regular language more powerful than context free language
(后面两个个选项记不清楚了,反正大意就是比较两个谁好.最后一个选项是两者不能进行这样的比较)

10 在编写代码是查找错误好还是用testing找好?

11 好像是说编译器可以修改type error的好处或不好。


逻辑推理部分

一个线性车库,5排5辆车,一车最多坐两人.
6个人.Tom,Jack, Gawen, Laurie, Mark, Paul.

.Mark独享车且紧跟空车后
.Tom不跟Gawen或Paul坐一辆车.
.Laurie跟别人共享车.
.Gawen在第三排或第四排.

一共5道题目,显然通过4个条件不能确定车序.有的题目是问存在的可能,有的题目是附加条件后问车序.


程序设计部分.

 

1 Translate MIPS assembly code into a function in C/C++
* your code should be concise
* no any GOTOs/pointers

MIPS code:


func:
     li v0,0
     li t0,0
l1:
     add t1,a0,a0
     lb t2,0(t1)
     beq t2,zero,l3
     bne t2,a1,l2
     add v0,v0,1
l2:
     add t0,t0,1
     j     l1
l3:
     jr ra


(caller register: t0~t9,a0~a3,v0~v1; callee s0~s7,ra)
然后列出了指令表,li是赋值,lb是将字段后第一个寄存器内容个字节的内容复制到第二个寄存器,beq是等值转移ben是不等值转移,j是无条件转移,jr转移至寄存器标示的内容.

实现数组的插入,查找,删除操作.

arr为指向数组的指针
len为数组长度.
count表示数组元素数目.
出错返回-1

int insert(int* arr,
  size_t len,
  size_t count,
  int val)
返回插入的数组索引.
插入后要求对数组排序.
出错处理

int search(int* arr,
  size_t len,
  size_t count,
  int val)
要求返回所找到的元素
出错处理

int remove(int* arr,
  size_t len,
  size_t count,
  int val)
要求返回删除的元素值
出错处理

 

测试部分.

1.你被分配到Internet Explorer研发部,(从核心到界面什么都可以).你如何设计,开发和测试它?

2.给你个DVD,你应当如何测试它,如果你的时间极其有限,你会测试什么?为什么?

3.给你一个字符比较函数strCmp(const char* string1, const char* string2)以及其返回值表明的意义,(>0, ==0, <0),设计测试case

4.一段字符串复制程序,指出其存在的错误和潜在缺陷.


最后是个论述题目,只有这个题目是要用英文作答的,上面的都可以用Chinese

问的是你在过去一年里做出过什么样的重要决定,你为什么做出这样的决定,这个决定对你的影响,你达到你作决定时期望的目标了没.有什么收获.

 

问的是你在过去一年里遇到什么样的问题,你如何解决的,是和别人解决的还是自己解决的?你达到你作决定时期望的目标了没,有什么收获。
 


 1写出下列算法的时间复杂度。
(1)冒泡排序;
(2)选择排序;
(3)插入排序;
(4)快速排序;
(5)堆排序;
(6)归并排序;

2写出下列程序在X86上的运行结果。

struct mybitfields
{
unsigned short a : 4;
unsigned short b : 5;
unsigned short c : 7;
}test

void main(void)
{
int i;
test.a=2;
test.b=3;
test.c=0;

i=*((short *)&test);
printf("%d/n",i);
}

3写出下列程序的运行结果。

unsigned int i=3;
cout<<i * -1;

4写出下列程序所有可能的运行结果。

int a;
int b;
int c;

void F1()
{
b=a*2;
a=b;
}

void F2()
{
c=a+1;
a=c;
}

main()
{
a=5;
//Start F1,F2 in parallel
F1(); F2();
printf("a=%d/n",a);
}

5考察了一个CharPrev()函数的作用。

6对 16 Bits colors的处理,要求:
(1)Byte转换为RGB时,保留高5、6bits;
(2)RGB转换为Byte时,第2、3位置零。

7一个链表的操作,注意代码的健壮和安全性。要求:
(1)增加一个元素;
(2)获得头元素;
(3)弹出头元素(获得值并删除)。

8一个给定的数值由左边开始升位到右边第N位,如
0010<<1 == 0100
或者
0001 0011<<4 == 0011 0000
请用C或者C++或者其他X86上能运行的程序实现。

附加题(只有在完成以上题目后,才获准回答)
In C++, what does "explicit" mean? what does "protected" mean?

 1.找Bug
int CopyStringCount(const char* Str)
{
        int nCount = 0;
        char* pBuffer;

        pBuffer = new char[_MAX_PATH];


        strcpy(pBuffer,Str);

        while(;pBuffer ;pBuffer++)
                if(pBuffer == '//') nCount ++;

        return nCount;
}

2. 写输出

void foo(int p1[])
{
        *p1 += 5;
}

void bar(int p2[])
{
        p2[1] = 15;
}


void main()
{
        int a[]={3,4,5};
        int b[]={3,4,5};
        int *p2;
        p2=&a[1];
        bar(p2);
        printf("%i %i %i/n",a[0],a[1],a[2]);
        p2=&b[0];
        p2++;
        foo(p2);
        bar(p2);
        printf("%i %i %i/n",b[0],b[1],b[2]);
}
 

A组题
1 选择填空题
多选题,一共十几道。

1.1考基本概念。比如为什么要使用函数(结构化,可重用之类的)。
1.2读程序写输出,或者找错。

1.2.1有一道比较难:
struct S {
    int i;
    int * p;
};
void main()
{
    S s;
    int * p = &s.i;
    p[0] = 4;
    p[1] = 3;
    s.p = p;
    s.p[1] = 1;
    s.p[0] = 2;
}
问程序会在哪一行死掉。

1.2.2有一题考静态成员变量的

int CalcMean(int i)
{   static int s, c;
    s+=i;  c++;
    return s/c;
}
求CalcMeas( CalcMeas(3) )=?

1.2.3
int calc(int a, int b)
{
    if(a >= b)
        return (a==b)?a:b;
    else
        return a+b+calc(++a, --b);
}
求calc(1, 5)等于?

1.2.4 IQ题(是填空的最后两题):

1、三个盒子,有一个有宝石,让你先选一个。然后主持人在剩下的盒子中打开一个空盒子(主持人知道宝石在哪个盒子里)。现在你有一次改变选择的机会。你改不改?

2、abcdef*2=cdefab
cdefab*2=efabcd
每个字母代表一个数字
abcdef=?

2 编程题
2.1 写一个CircularQueue()
2.2 写一个Merge函数。把两个已排序的链表合并。两个链表一个是升序,一个是降序。

3 设计(可用中文)
设计一个密码对话框,用来保护用户的文件。

1、写出设计文档

2、写出各种功能的priority,以及为什么这样设定。

3、如果开发人员根据你的要求实现了这个对话框,你准备如何测试它?写出测试的各点。

4 测试(可用中文)

4.1 已知有一个函数,它的功能是将字符串转换成数字,你如何测试它?假设函数是这样的形式:atoi(char *, int*) 。请列出所有可能的测试案例。

4.2 现在有一个Web搜索引擎,它说它拥有了搜索的功能。你怎样测试它?请写出你想要测试的各个方面以及方法。

5 要用英文做答opening question
5.1 你曾经有过什么非常有创意的想法?最好是软件方面。
5.2 你想让开发者添加一个他认为不重要的功能,你会怎么做?英文是:
How would you convince a developer to add a feature
 that the developer does not view as importart?


 1 给一个字符串,把其中的空格滤掉
2 给一个字符串,统计其中的单词数目(每个单词出现了多少次)
3 编写一个类,实现集合的加,减,合并

感觉微软非常重视字符串的基本操作

1.从两段程序说明全局变量和局部变量的区别
2.CBuffer的类成员函数的改错编程题Allocate和SaveString
3.简单字符处理的改错题
5.一个字符处理的程序,问运行结果(还有点意思)
6.链表反转的题