程式設計師面試邏輯題解析筆記(一)

2021-06-17 17:47:14 字數 2839 閱讀 6439

題目1:甜食愛好者

傑里公尺和瑪麗是兩個喜歡蛋糕也喜歡數學的小孩,當瑪蒂娜大廚給他們準備了兩塊一模一樣的蛋糕後,傑里公尺便說服瑪麗玩乙個遊戲。

遊戲規則:傑公尺裡先把一塊蛋糕切成兩塊,這兩份大小可能一樣,也可能不一樣,切完之後,瑪麗決定是否要先選蛋糕。如果瑪麗先選,那麼她會選份大的,如果傑公尺裡先選,瑪麗可以預料傑里公尺會選走份大的。

隨後傑里公尺把另外一塊也切兩份,注意,他可以把其中乙份切得非常小,如果之前 瑪麗先選,那麼這次傑里公尺就可以拿走大的那份,如果之前是傑公尺裡先選,那麼這次瑪麗就可以拿走大的那份。

假設每個小孩的目標是分得盡可能多的蛋糕,那麼對於傑里公尺來說最好的策略是什麼呢?

解析:可以假設第一塊分為兩份,分別用f和1-f來表示。其中f >= 1/2。假設下面兩種情況:第一種,瑪麗先選擇,拿走了f那塊;第二種情況,瑪麗後選,拿走了1-f那塊。依次進行分析。

瑪麗可以如下分析:

如果是我先選的情況:第一塊她拿走了f,那麼傑里公尺在分第二塊時,肯定分為一塊很大,一塊非常小。也就是瑪麗一共就得到了f。

對於我後選的情況:第一塊中,瑪麗得到了1-f,那麼傑公尺裡在分第二塊時,之後平分,他才能獲得最多的蛋糕,也即瑪麗可以得到1/2

傑里公尺也會想到瑪麗所分析的情況。所以傑公尺裡必須使自己在兩次中得到的量一樣多,才能確保自己得到最多的蛋糕。

即讓瑪麗兩種情況下得到一樣多: f = 1-f + 1/2     可以知道 f = 3/4

無論第一次分時,f大於3/4或小於3/4,瑪麗都會得到更多的蛋糕。

補充:1.之後,大廚瑪蒂娜做了三塊一模一樣的長方形蛋糕,傑里公尺和瑪麗都非常想吃。這次的分法發生了變化。傑里公尺還是負責切蛋糕,但是瑪麗有兩次先選擇蛋糕的機會,而傑里公尺只有一次。也就是傑公尺裡先切一塊,由瑪麗決定是否先選;傑公尺裡再切第二塊,瑪麗決定是否進行先選,第三塊依次。但是瑪麗要留其中依次機會給傑公尺裡先選擇。      

解析:如果第一塊時,傑公尺裡先選的,那麼他肯定選擇大的乙份,即f,後面兩次只能讓瑪麗先選,因此後兩塊的分割方法就是評分。傑公尺裡得到的蛋糕為 f + 1,而瑪麗得到的為 1-f +1/2 + 1/2 = 2 – f

第一塊瑪麗先選,則她可以得到大份蛋糕f,而剩下的兩塊則與上面我們的分析相同。即傑公尺裡最多可以分得5/4,瑪麗可以得到 3/4

兩種情況下:瑪麗得到的分別是 2 – f 與 3/4 + f,要讓瑪麗得到的一樣多,f = 11/8

傑公尺裡可以得到 13/8

2.假設有7塊一樣的蛋糕,瑪麗有6次先選蛋糕的機會,誰會有優勢?優勢有多少?

使用歸納分析方法:假設有k塊蛋糕,瑪麗有k-1次先選的機會。這種情況下,假設傑公尺裡有a塊的優勢(也就說傑公尺裡可以比瑪麗多分k塊中的a塊蛋糕),那麼在有k+1塊蛋糕時,傑公尺裡依舊占有優勢。分為兩種情況分析:

對於第k+1塊蛋糕,如果瑪麗先選,則傑公尺裡可以將蛋糕分割為1/2 – a/4和1/2 + a/4。瑪麗選1/2 + a/4,比傑公尺裡可以多a/2 的蛋糕,這樣在剩下的k塊蛋糕中,傑公尺裡可以多分a塊。這樣他比瑪麗多分了a/2塊。

如果瑪麗後選,傑公尺裡選擇1/2 + a/4,剩下的k塊蛋糕則全部被平分,傑公尺裡依然多得到了a/2塊蛋糕。      

兩塊蛋糕時,傑公尺裡比瑪麗多1/2,三塊時,比瑪麗多1/4,依次可知當7塊蛋糕時,可以比瑪麗多分1/64。

3.假設總是讓傑里公尺來切蛋糕,有沒有辦法確保兩個小孩得到一樣多的蛋糕?      

除非每次都是瑪麗先選蛋糕,否則沒有辦法實現兩個小孩分得的蛋糕一樣多。

題目2:拜占庭賭徒

受到假想的拜占庭陰謀啟發,設定如下的賭局,稱為「拜占庭賭徒」。

賭局規則:你和一群「顧問」一起參與賭局。其中乙個顧問會在一張紙上寫下0或者1,展示給其他顧問看,但不會讓你看到,然後把那張紙扣著放在你的面前。隨後每個顧問都會告訴你紙上寫的是什麼數字。他們都是演技精湛的人,因此你無法通過任何明顯的面部表情或記號分別出他們是否在說謊。每一局,你都可以選擇不下注,也可以壓上你的部分甚至全部資產。

問題:假設一共有四位顧問,其中兩個人會一直說實話,但是你不知道是那兩位。你可以玩三局,每一局都用等額投注(壓注多少,則賠多少)。賭局開始時,你有100美元,你能確保贏多少錢呢?

解析:如果四個顧問中,有3個或四個給你的建議相同,那麼就在他們說的那個數字上壓上最大的注。因為至少有兩個人總說實話,因此三個人或四個人的建議相同,那麼至少乙個人的話是對的,因此穩贏。

如果每兩個人給的建議是相同的,那麼這局可以暫時不押注,第一局結束以後就知道了那兩個顧問是說實話的,那麼後面的兩局中,可以將壓最大注,這樣兩局中就可以得到400美元。

因此最少可以確保贏300美元。

補充:1.假設現在只有三位顧問,而且只有乙個人會一直說實話。你還是可以玩3局,每一局都採用等額投注。賭局開始時,你有100美元,你能確保贏多少錢呢?

分析方法類似上例:

如果三個人的答案相同,那麼由於其中至少乙個人會說真話,因此,可以押注最大值,肯定會贏。

如果兩個人答案一樣,這時分為兩種情況:相同的兩個人是說謊的兩個顧問和相同的兩個人乙個是說謊的顧問,乙個是誠實的顧問。

首先可以拿出x元,押注那答案相同的數字。如果輸了,第一局結束則知道另外乙個人就是說真話的了,那麼剩下兩局就可以得到4*(100-x)美元。

如果贏了,則具有100+x美元;第二局如果這兩個人的答案不同,可以先不下注,等一局,第二局結束則知道說實話的人,那麼第三局時可以最終獲得2*(100 + x)。因此最少可以獲得這個數字的錢,或更多。

讓兩種情況下得到的錢數相同:4*(100-x)= 2*(100+x),最終可知x=100/3。那麼最終至少可以得到啟動資金的8/3,也即266.66美元

2.四輪賭局,四位顧問,其中3位可以隨意說謊,另一位四次中必須至少3次說實話,在這種情況下,你能保證贏多少?

(暫略)

3.如果你可以參加5局,「不總說實話」的顧問5次中必須有四次說實話,另外三位可以隨意說謊,這種情況下,你能保證最後至少還有150美元嗎?

(暫略)

75道程式設計師面試邏輯題

假設有乙個池塘,裡面有無窮多的水。現有2個空水壺,容積分別為5公升和6公升。問題是如何只用這2個水壺從池塘裡取得3公升的水。周雯的媽媽是豫林水泥廠的化驗員。一天,周雯來到化驗室做作業。做完後想出去玩。等等,媽媽還要考你乙個題目,她接著說,你看這6只做化驗用的玻璃杯,前面3只盛滿了水,後面3只是空的。...

程式設計師面試寶典一

1 int i i 首先宣告乙個變數i,然後將變數i的值 未初始化 賦值給自己 2 下面 的意義 void func int x,int count 求乙個整數轉換為二進位制之後包含多少個1 3 printf在vc6.0下是自右向左運算的 好像跟編譯器有關 int arr int ptr arr p...

程式設計師面試

1.內聯函式和巨集的差別 內聯函式要做引數型別檢查,這是內聯函式和巨集相比的優勢 2.指標和引用的區別 1 非空區別。乙個引用不能指向空值,必須指向乙個物件。指標可以為空。2 合法性區別。使用引用不用檢測其合法性,但指標必須先檢查是否合法。3 可修改區別。指標在初始化之後還可以修改其指向的內容,但是...