天天看點

網易五道遊戲筆試題

網易五道遊戲筆試題

1、兩個圓相交,交點是A1,A2。現在過A1點做一直線與兩個圓分别相交另外一點B1,B2。

B1B2可以繞着A1點旋轉。問在什麼情況下,B1B2最長?

解:

設兩個圓的圓心分别為O1,O2。作O1C垂直于B1B2,O2D垂直于B1B2。

|B1B2| = |A1B1| + |A1B2| = 2|A1C| + 2|A1D|=2|CD|

|CD| ^2 = |O1O2|^2 - (|O1C|-|O2D|)^2

當|O1C|=|O2D|即B1B2平行于O1O2時,|B1B2|最大。

2、Smith夫婦召開宴會,并邀請其他4對夫婦參加宴會。在宴會上,他們彼此握手,

并且滿足沒有一個人同自己握手,沒有兩個人握手一次以上,并且夫妻之間不握手。

然後Mr. Smith問其它客人握手的次數,每個人的答案是不一樣的。

求Mrs Smith握手的次數?

解:

   1. 總共10個人,每個人不與自己握手,不與配偶握手,不與同一個人握超過一次手,是以每個人最多握8次手,最少0次; 

   2. Mr.Smith問其它9個人握了幾次手,各人回答不一樣,是以每個人的握手次數剛好為0-8次,每種不同次數有1個人; 

   3. 有且隻有一個人握了8次手,稱之為A,即A與其配偶以外的所有人都握了手; 

   4. 記A的配偶為a,除了A夫婦以外,所有人都至少握了1次手(和A),是以握手0次的肯定是a; 

   5. 從10個人中去掉A夫婦,因為A與其餘每個人握了1次手,而a沒有與别人握手,是以去掉A夫婦後,其它人的握手次數為1-7(不算Mr.Smith),再去掉他 們各自與A握的那次手不算,則各人的握手次數為0-6,還是每種不同次數剛好有1個人; 

   6. 重複第3-5步4次,直到去掉4對夫婦,最終剩下Mr.&Mrs.Smith,這時Mrs.Smith的握手次數為0,加上4次循環中去掉的4次握手,她總共握 了4次手,與每對夫婦中的某一位各握了一次。

故:Mrs Smith握手的次數為4次

3、有6種不同顔色的球,分别記為1,2,3,4,5,6,每種球有無數個。現在取5個球,求在以下

的條件下:

1、5種不同顔色,

2、4種不同顔色的球,

3、3種不同顔色的球, 

4、2種不同顔色的球,

它們的機率。

既然每種顔色的球都是無數的話,就相當于有6個不同顔色的球,拿了之後再放回去,一個道理啦! 針對所有可能是6的5次幂為7776;

1.5種顔色:先選5個顔色,那就是C(6,5),那麼考慮到任意選擇順序,p(5,5) = 5!,結果是C(6,5) * P(5,5) = 720; 2.4種顔色:先選4個顔色,那就是C(6,4),那麼肯定會有重複顔色,挑出重複顔色是C(4,1).考慮到任意拿球順序是P(5,5),去掉重複的是2!.結果是C(6,4)*C(4,1)*5!/2!. 3.3種顔色:先選3個顔色,那就是C(6,3),那麼重複顔色是兩種可能,比如abccc和abbcc,前者是C(3,1)*5!/3!,後者是C(3,2)*5!/2!/2!,結果是C(6,3)*(C(3,1)*5!/3!+C(3,2)*5!/2!/2!).  4.同理,一種是abbbb,一種是aabbb.前者是C(2,1) * 5!,後者是C(2,1)*5!/2!/3!.結果是C(6,2)*(C(2,1)*5!/4!+C(2,1)*5!/2!/3!). 5.就一種顔色,那就是6種啦啦啦。 加起來 720+3600+3000+450+6=7776 恰好所有的情況都包含在内。 (總的情況為6^5=7776)

4、有一次數學比賽,共有A,B和C三道題目。所有人都至少解答出一道題目,總共有25人。

在沒有答出A的人中,答出B的人數是答出C的人數的兩倍;單單答出A的人,比其他答出A的人

總數多1;在所有隻有答出一道題目的人當中,答出B和C的人數剛好是一半。

求隻答出B的人數。

解:

設以下變量:

Y: 隻答出A的人數

Y-1:其他答出A的人數

X:沒有答出A的人中,答出C的人數

2X:沒有答出A的人中,答出B的人數

Z:沒有答出A的人中,答出B與C的交集。

如下圖所示:

網易五道遊戲筆試題

可以列出兩個方程:

Y+(Y-1)+Z+(2X-Z)+(X-Z)=25  (1)

Y+(X-Z)+(2X-Z)=2(X-Z+2X-Z) (2)

通過嘗試帶入數字的方法,可以得到一組解,X=4,Z=2,Y=8,是以隻答出B的人數為2X-Z=6.

5、從尾到頭輸對外連結表

題目:輸入一個連結清單的頭結點,從尾到頭反過來輸出每個結點的值。連結清單結點定義如下:

struct ListNode

{

  int  m_nKey;

  ListNode* m_pNext;

};

代碼為:

void PrintListReversely(ListNode* pListHead)

{

      if(pListHead != NULL)

      {

            // Print the next node first

            if (pListHead->m_pNext != NULL)

            {

                  PrintListReversely(pListHead->m_pNext);

            }

            // Print this node

            printf("%d", pListHead->m_nKey);

      }

}