網易五道遊戲筆試題
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的交集。
如下圖所示:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISM1ADOzETM2ETMzUDMzEDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
可以列出兩個方程:
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);
}
}