微软 2004-10-16 笔试题解析

笔试题

微软 2004-10-16 笔试题解析


  者:杨延庆
E-mail
blankmanATtomDOTcom
  处:http://blog.csdn.net/blankman/archive/2004/11/14/WE_MS_20041016.aspx


(微软2004-11-13的笔试题解析,如果有侵犯微软版权的话请来信告知,立即删除)

1、求函数返回值,输入x=9999;
int func(x)

    int countx = 0
    while(x)
    {
        countx ++;
        x = x&(x-1);
    }
    return countx;
}
【试题解析】
    解这道题的时候,如果拿出一个二进制数来分析就会容易的多了,x=x&(x-1)实际上就是把x的二进制形式的最后一个“1”变成“0”,x的二进制形式有多少个“1”循环就执行多少次。

9999/256 = 39 余 15,把这两个数分别转化一下就很快了
39 = 32 + 4 + 2  +1 = 00100111
15 = 0F = 00001111
所以 9999=0010011100001111,共有8个1,答案就是 8 了

2、实现以下程序,以方便binary search.
.要有处理错误语句
.队列的分配的大小是固定的MAX_LEN,由第二个参数输入
.不能复制队列
insert (int *arr,           //队列
        size_l len,          // 队列大小
        size_l count,        //队列元素的数目
        int varl             //要处理的数据
)返回插入数据的索引
remove(int *arr,size_l len,size_l count,int varl)返回删除元素的索引
search(int *arr,size_l len,size_l count,int varl)返回搜索道元素的索引
【试题解析】
    略。数据结构书上都有的。

3、堆栈R,从顶到底:{2,4,6,8,10},逐个取出放入队列Q中 ,再从Q中逐个取出放入R中,问现在堆栈R中从顶到底的顺序。
【试题解析】
    这个也不用了吧,{10,8,6,4,2}

4、写出程序的结果:___________
int funa(int *a)
{
   a[0] ++;
}

int funb(int b[])
{
   b[1] += 5;
}

main()

   int a[5] = {2,3,4,5,6}; 
   int b[5] = {2,3,4,5,6}; 
   int *p;
   p = &a[0];
   (*p)++; 
   funa(p);
   for(int i = 0; i<3; i++)
   printf("%d,",a[i]);
   p = &b[1]; 
   funb(p);
   for(i = 0; i<3; i++)
   printf("%d,",b[i]);
}
【题目解析】
结果是:
4,3,4,2,3,9

(*p)++; 也就是a[0]++;
funa(p);中的 a[0]++ 是将 main 中的数组 a[0]++,
数组 a 中只有第一个元素加了两次 1 ,

p = &b[1];把p指向了数组 b 的第二个元素
funb(p);中的 b[1]+=5 是将 main 中的数组 b[2]+=5
数组 b 中的第三个元素加了 5


5、找出下面程序的 BUG
int CopyStringAndCount(char * Str)

    int nCount = 0; 
    char * pBuffer; 
  
    pBuffer = new char[MAX_PATH_LENGTH]; 
    

    
    strcpy(pBuffer, Str); 

    for ( ; pBuffer; pBuffer++ )
        if ( pBuffer=='//' ) nCount ++; 
    
    
    return nCount;
}

【题目解析】
① (const char * Str)
   如果在函数体内不需要改变字符串的内容,最好加上 const 以免误修改字符串内容
② char * pBuffer = NULL;
   指针声明的时候最好赋初值 NULL
③ if ( !pBuffer ) return -1;
   开辟空间之后没有检查是否成功,没有错误检查
④ if ( strlen(Str)>(MAX_PATH_LENGTH-1) ) return -2;
   没有检查新开辟的空间能否容纳传进来的字符串,否则有可能越界
⑤ *pBuffer
   题中的原意是当到字符串末尾的时候跳出循环,所以应该是取字符串的内容
⑥ 同⑤
⑦ delete pBuffer; pBuffer=NULL;
   没有释放新开辟的空间,会造成内存泄漏


6、你觉得下一代浏览器应该添加什么功能?
【题目解析】
    当时随便写的,比如安全性,搜索功能等。


7、给出函数strcmp()的测试方案
   int strcmp(const char * str1, const char *str2)
【题目解析】
    主要考查考虑问题的全面型,我觉得有一个电冰箱测试的例子不错
 我写了几个(仅供参考):
            str1        str2
            NULL        NULL
            "a"         NULL
            NULL        "a"
            "a"         "abc"
            "abc"       "acd"
            ".xj"       "sefn"


8、测试一个 DVD Player,如果你仅有有限的时间,你会如何做?

【题目解析】
    只是说说我的思路,不是标准答案。首先测试基本功能,然后是常用功能,然后是高级功能。


9、在过去的这些年,你遇到了哪一个最大的困难,你是如何解决它的?你是单独做的还是和别人一起做的决定?为什么做这个决定?现在结果如何?


10、逻辑题:

有一5节车厢的过山车,每节能座两人,现有Luair,Jack,Gwen,Tom,Mark,Paul,6人去乘车,有以下条件
1,Luair和别人同乘
2,Mark 不合别人同乘,而且Mark的前一节车厢是空的
3,Tom 不和Gwen 与 Paul 中的任何一人同乘
4,Gwen乘3,或者4节
....下面是一些断言性的语句,让你判断对错

【题目解析】
    Mark和那节空车厢可以当作一个整体,剩下的就是按照规则做排列组合就可以了,可能的种类不是太多。如果用笔画个草图的话就比较容易了。


11、链表反转: (这道题不是微软的,不过考的比较多,就不另外开贴了)

数据结构如下:
typedef struct _Node
{
    int data;
    struct _Node *next;
} Node;
完成函数 Node *Reverse(Node *head),head为不带头节点的链表的首部。

Node *Reverse(Node *head)
{
    Node *tmp     = NULL;                // 缓冲变量
    Node *newHead = NULL;                // 反转后的新头节点
    
    if ( head==NULL ) return head;       // 空链表的情况
    if ( head->next==NULL ) return head; // 链表只有一个节点的情况
 
    while ( head )                       // 判断有没有移动到最后
    {
        tmp=head->next;                  // 临时记录下一个节点

        head->next = newHead;            // 把原来链表中的节点放到新的链表的首部
        newHead = head;

        head = tmp;
    } // end of while

    return newHead;

} // end of Reverse


(补充中......)

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值