1. 程式人生 > >2018秋招做題記錄

2018秋招做題記錄

喝可樂問題

拼多多的一道題,A,B,C,D四小夥排隊在買可樂,A買完繼續到隊尾排隊,並且此時一個A變成兩個A(雙重影分身術?),求問第n個人買可樂時,是4個人裡的哪一個?

  • 解題思路
    很容易就想到佇列,但是抱歉,超時。這時候你不得不感慨,什麼時候有點數學分析能力壓身會是一件多麼幸運的事情,可惜當時並沒有來得及思考。現在來分析的話,反相思考,不關注於隊首,而假設這個隊無限長,裡面一開始就是這樣排列的:
    ABCDAABBCCDDAAAABBBBCCCCDDDD…….
    那這個時候問你第n個位置是誰,是不是更好分析些?
    沒錯,然後劃分區間,其實整個隊伍可看成:第1個長為4(每個元素出現2^0次)的小佇列 ,第二個長為8(每個元素出現2^1次)的小佇列,第三個長為16(每個元素出現2^2次)的小佇列,一直下去,那麼第k(k=1,2…)個小佇列,長為4x2^(k-1),每個元素出現2^(k-1)次;好了,現在我們可以肯定,第n個元素肯定是在第k個區間裡,而它左邊共有k-1個這樣的區間,總共含有元素個數是:4x1 + 4x2 + 4x2^(k-1) = 4x(2^k - 1);而加上第n個元素所在的第k個區間佇列總共有4x(2^(k+1) - 1)個元素,求出k值,然後計算前面所有k-1個區間的總元素和,n個元素減去該和,然後除以該區間內每個元素的個數,得到的就是序列值;

  • 實現程式碼

/**
 * 計算第n個喝可樂的是誰?
 * @param n 輸出
 * @return 返回 1 - 4 裡的某一個數
 */
 static int getIndex(int n) {
     int k = (int) (Math.log((n-1) / 4 + 1) / Math.log(2)) + 1;
     int num = (int) ((Math.pow(2, k - 1) - 1) * 4);
     int index = (n-1 - num) / (int) (Math.pow(2, k - 1)) + 1;
     return index;
 }

紅眼睛和藍眼睛

摘自虎撲步行街某jr的帖子

今天看到街上邏輯題挺多的,然後之前街上也有過紅藍眼邏輯題,不過找不到了,不知道是不是被刪除
不管了那就我來吧
決定轉一個我很喜歡的紅眼睛藍眼睛題來給大家看看
一個島上有100個人,其中有5個紅眼睛,95個藍眼睛。這個島有三個奇怪的宗教規則。
1.他們不能照鏡子,不能看自己眼睛的顏色。
2.他們不能告訴別人對方的眼睛是什麼顏色。
3.一旦有人知道了自己是紅眼睛,他就必須在當天夜裡自殺。
某天,有個旅行者到了這個島上。由於不知道這裡的規矩,所以他在和全島人一起狂歡的時候,不留神就說了一句話:【你們這裡有紅眼睛的人。】
問題:假設這個島上的人足夠聰明,每個人都可以做出縝密的邏輯推理,請問島上會發生什麼?

  • 解題思路

遊客沒有輸入任何新的資訊」這個斷言是錯的。
N=1的情形不必說了,顯然輸入了新資訊。
對於N>1的情形,要注意,遊客必須是當著所有人的面公開做出宣告,如果他是私下分別對每個人說的,就不會起任何作用。「公開宣告」這一舉動的意義不是讓每個人都知道「島上有紅眼睛」,而是讓每個人都知道「每個人都知道每個人都知道……每個人都知道島上有紅眼睛」。在遊客公開宣告之前,島上的人是不可能具有這個多階知識的,這就是遊客輸入的新資訊。
以N=2為例,公開宣告之後,紅1立刻獲得了一個新的2階知識:「紅2知道島上有紅眼睛」,在公開宣告之前,他沒有能力判斷這個2階命題的真假,因為在這之前命題的真假依賴於紅1自己的眼睛顏色。同樣,紅2也獲得了新知識「紅1知道島上有紅眼睛」。
N=3時,公開宣告使得紅1立刻獲得了一個新的3階知識:「紅2知道紅3知道島上有紅眼睛」,在此之前,這個3階命題的真假也是依賴於紅1自己的眼睛顏色(紅則為真,藍則為假)。同樣,紅2和紅3也獲得了類似的知識。
N=4,5,6,…依此類推。
簡單說,「島上有紅眼睛」這件事本來只是一項「共有知識」,公開宣告使它變成了一項「公共知識」。這兩種知識的區分在認知邏輯裡面非常重要,在博弈論中有廣泛的應用。


真話和假話

晚上睡不著,想一些有意思的邏輯題,少年時代看包拯3時的對遼使機智問答再一次浮現在眼前,當時一直不能理解,現在趁著秋招學習的勁兒,稍微想了下居然發現原來是這樣。

兩個使者都帶來了一個盒子,一人手裡拿著戰書,一人拿著和書,其中一人必須說真話一人必須說假話,而你只能問其中一個人一個問題,對方的回答只能是“是”或“不是”,試想,大宋要求和,該怎麼提問?

當時電視裡給的包拯的回答是:包拯提問其中任意一個使者A:
——假如我問使者B手裡的是戰書麼?他會怎麼回答?
基於此,不管A怎麼回答,都可以鎖定最後的答案:當然這個得是基於A和B的知識互通,都瞭解對方說的是真假話,並且思維邏輯都沒問題;

  • 試想如果A說真話,並且回答:是,由於A是清楚B說的是假話,那麼A說的是其實是符合B說的語境,就是說B說的是假的,說以B手裡的是和書;
  • 如果A說的是假話,並且回答:是,由於A是清楚B說的是真話,那麼A就會故意說B的反話,只有當B說不是時,A才會說是,所以可以推出B說的是不是,那麼B手裡拿的就是和書;

其他的回答都可以類似這樣去推出答案。


三姬分金問題(海盜博弈)

參考了知乎某答主的回答
三個人是絕對聰明並且理智的。理智指,在利益最大時,能不殺人就不殺人。
三人都是理性人,都想在保全自身性命的情況下獲得更多的金幣
1、丙想獲得最多的錢就只要否決了甲和乙的分配方法就行了。
2、乙知道,如果甲分配的方案被否決,那麼在之後兩人博弈中,方案認同不能超過半數就會被處死。所以乙應該支援甲的所有決策。
3、甲知道乙一定會支援自己的決定,所以甲會將自己的利益最大化。

因此甲可以選擇(100,0,0)的分法;也可以是(99,1,0)的分法,這樣用1枚金幣籠絡乙的人心,體現動漫裡的“仁”的思想。

還有類似的海盜分金問題


三門問題

還是BXJ的JR的一個回答,一下子解除了我許久的疑惑~~