微軟部分面試題解析與答案

來源:互聯網
上載者:User

微軟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); 
   p = &b[1]; 
   funb(p); 
   for(i = 0; i<3; i++) 
   printf("%d,",b); 

【題目解析】
結果是:
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

 

1、下面的程式運行時哪裡會出現錯誤:

struct S

{

    int i;

    int * p;

};

 

int main()

{

    S s;

    int * p = &s.i;

    p[0] = 4;

    p[1] = 3;

    s.p = p;

    s.p[1] = 1;

    s.p[0] = 2;

 

    return 0;

}

【題目解析】

這道題考的是對結構體記憶體使用量情況的理解。在32位的作業系統中,int和指標類型的變數佔用空間都是4個位元組。在本題中&s.i的值實際就是 &s的值,所以“int * p = &s.i”也就相當於把p指向了結構體s的地址的起始位置。1所示。

 

圖1

假設 &s的值為0x12300,則p的值也是0x12300,p[0]指的是從0x12300開始的連續4個位元組的空間,p[1]指的是從0x12304(注意!不是0x12301)開始的連續4個位元組的空間。這樣,p[0]也就相當於s.i,p[1]也就相當於s.p,分析到這一步,可以確定程式運行到“s.p=p;”這裡不會出錯。繼續往下看。

在進行了“s.p=p;”的賦值之後,s.p指向的是s的首地址,此時s.p[0]相當於s.i,s.p[1]相當於s.p。

下一句“s.p[1]=1”執行過之後,此時s.p的值為1,也就是指向記憶體的0x00001處,隱患出現了。在執行“s.p[0]=2”的時候,實際上是向記憶體0x00001起始的連續四個位元組寫入0x00000002,而那塊記憶體不屬於這個程式,會出現訪問非法記憶體的錯誤。

VC解析的彙編代碼如下(部分),有興趣的可以參考一下。
;   14:       S s;
;   15:       int * p = &s.i;
00401028    lea         eax,[ebp-8]
0040102B    mov         dword ptr [ebp-0Ch],eax
;   16:       p[0] = 4;
0040102E    mov         ecx,dword ptr [ebp-0Ch]
00401031    mov         dword ptr [ecx],4
;   17:       p[1] = 3;
00401037    mov         edx,dword ptr [ebp-0Ch]
0040103A    mov         dword ptr [edx+4],3
;   18:       s.p = p;
00401041    mov         eax,dword ptr [ebp-0Ch]
00401044    mov         dword ptr [ebp-4],eax
;   19:       s.p[1] = 1;
00401047    mov         ecx,dword ptr [ebp-4]
0040104A    mov         dword ptr [ecx+4],1
;   20:       s.p[0] = 2;
00401051    mov         edx,dword ptr [ebp-4]
00401054    mov         dword ptr [edx],2

2、ABCDEF各是一個0~9的數字,根據下面的條件確定A~F的值
ABCDEF*2 = CDEFAB
CDEFAB*2 = EFABCD

【題目解析】
以下答案由winion提供
ABCDEF各是一個0~9的數字,根據下面的條件確定A~F的值 
ABCDEF*2 = CDEFAB 
CDEFAB*2 = EFABCD 
一看到題目,我立即就想到了1/7,它正好滿足這個數位性質。所以答案是142857. 
......
1/7=0.142857 
2/7=0.285714 
3/7=0.428571 
4/7=0.571428 
5/7=0.714285 
6/7=0.857142 
然後是迴圈,注意到沒有,都是142857這六個數字。 
以下答案由大輝提供
ABCDEF*2 = CDEFAB 
CDEFAB*2 = EFABCD 

2*AB = CD 
2*EF = 1AB 
2*CD+1 = EF 

8AB+2 = 100+AB 

AB = 14 
以下答案由dawangzi16 提供
1. E>2C>4A;==>a=1or2; 

2. 因為EF*2=AB ,結合式子1得:(if A=2 then E=8 or 9 此時不成立) 所以 A=1; E=5; 
同時得出F大於5; 此時:1BCD5F*2=CD5F1B;CD5F1B*2=5F1BCD; 

3。因為1B*2=CD 所以推出:c=3或2; 又由CD*2=5F; 推出C=2 ; D>5; 
此時:1B2D5F*2=2D5F1B;2D5F1B*2=5F1B2D; 

4。因為1B*2 = 2D 而且D>5,推出B<5 ;當 B=3時D=6;B=4時D=8; 
又因為5F*2=1B 所以 B為偶數。 從而 B=4 ,D=8; 
此時 14285F*2=285F14;285F14*2=5F1428; 

5。不難看出 F=7; 
從而得解 
以下答案由 xiahui 提供
令AB=x, CDEF=y; 
則(10000x+y)*2 = 100y+x; 
19999x = 98y 
2857*7x = 7*14y 

故得AB=14,CDEF=2857

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.