A. 程序員經典面試題:並發,容易帶來哪些問題
編程對於很多人來說,還是比較好上手的。當你學會了一門語言,可以編寫一些程序了,很快就會遇到一道坎,並發編程,單線程下好好跑著的程序,怎麼就運行異常了?怎麼就得不到期望的結果。在面試中,並發編程也是經常出現,我們今天來討論一個問題, 並發編程,容易出哪些問題?
相信大家在學習並發編程的時候,都會遇到這樣一個經典問題,有一個函數,執行i=i+1,執行1000遍。在單線程的環境下,得到的結果都是預期的1000。如果是兩個線程同時運行,那麼,得到的結果可能是2000,也有可能小於2000。
這是因為i=i+1不是一個原子操作,我們會獲取i的值,然後執行一次加法運算,最後將結果賦值給i。當多個線程執行的時候,獲取到的i的值之後,在執行後面的動作之前,另外一個線程已經修改了i,造成最終的結果小於2000。
並發編程的時候,我們往往無法確定多個線程之間的執行順序,經常我們會出現這樣一個錯誤。我們在一個線程中使用的變數,會在另外一個線程中進行初始化或者賦值。最常見的,便是我們在主線程上創建一個子線程,然後再進行變數的初始化,子線程的執行可能早於父線程,造成程序錯誤。
為了解決並發問題,我們通常會引入鎖、信號、信號量等手段來保證臨界區只會被一個線程訪問,或者讓一個線程等待另外一個線程執行完成。但是,引入鎖之後,我們又可能會出現死鎖的問題,例如:線程1與線程2都需要搶佔AB兩把鎖,假設線程1先搶佔了A鎖,線程2搶佔了B鎖,這個時候,線程1在等待B鎖,線程2在等待A鎖,就這樣,等到海枯石爛,我們稱之為死鎖。
出現死鎖,需要同時滿足下面幾個條件:1.線程需要對需要的資源進行互斥訪問(例如一個線程搶到鎖)2.持有並等待(例如一個線程搶到了A鎖,然後在等待B鎖)3.非搶占(線程搶到了鎖之後,不能被其他線程搶到)4.循環等待,線程之前存在一個環路。
那麼,如何解決死鎖的問題呢?既然出現死鎖需要同時滿足上面的幾個條件,那麼,我們只要破壞其中一個條件,就能夠避免死鎖問題。
今天,我們了解到並發編程帶來的問題與解決方案,希望對你在平時的工作或者面試有所幫助。
B. 程序員面試要准備些什麼東西
面試前的准備
簡歷
1. 千萬別給自己挖坑
在面試的時候,面試官都會針對簡歷上技術能力、工作經歷、項目經驗等提出一些細節上的問題,所以你寫下的都些東西必須是真實,並且是非常了解。
2. 要有辨識度
通常一個職位可能收到的簡歷比較多,很多時候,你的簡歷甚至根本沒被HR看到。那麼,怎樣讓自己的簡歷脫穎而出呢?首先,簡歷要有「辨識度」,要讓面試官看完這個簡歷,就很想見見這個人。
3. 面試前最好進行一個「模擬面試」
其實自己在製作簡歷的時候,就像寫程序一樣自己是很難發現bug的,因此在面試前最好找朋友、老師或同學幫你來一場「模擬面試」,這樣也許會發現一些意想不到的問題。
4. 針對不同的公司要對簡歷進行微調
比如對方是個做電商。而你恰好做過類似項目,就可以將該部分的項目介紹著重突出以下,比如排列到最前面。
充分准備相關的專業知識
可以在網上收集一些相關的面試題,有時面試官也可能會照著網上的內容來問,所以網上一些比較熱門的題目也可以關注一些,然後對照自己的經驗組織成自己的語言。
項目經驗
項目的研發背景、整體業務流程、開發周期、負責的模塊、技術實現細節、技術亮點等。自己做過的每個項目都要整理清楚。
了解熱門前沿技術
比如你面試的是 iOS 開發崗位,除了 OC 你還能聊聊最新版本的 Swift;比如現在微信小程序開發又火起來了,你也在關注和學習,甚至能解決面試官的一些問題。了解這些熱門的前沿技術絕對會成為你面試時的加分點。
C. 程序員面試問題及答案
程序員面試問題及答案
程序員是從事程序開發、維護的專業人員。我整理的程序員面試問題及答案,希望大家喜歡!
1、兩柱香問題
題目:有兩柱不均勻的香,每柱香燃燒完需要1個小時,問:怎樣用兩柱香切出一個15分鍾的時間段?這個題的重點就是怎麼切。
解答:將甲香的一頭點著,將乙香的兩頭點著,當乙香燃燒完時,說明已經過了半個小時,同時也說明甲香也正好燃燒了一半,此時,將甲香的另一頭點著,從此時起到甲香完全燒完,正好15分鍾。
2、燈管問題
在房裡有三盞燈,房外有三個開關,在房外看不見房內的情況,你只能進門一次,你用什麼方法來區分那個開關控制那一盞燈?
解答:打開一盞燈10分鍾,關掉,打開第二盞,進去看看哪盞亮,摸摸哪盞熱,熱的是第一個打開的開關開的,亮的是第二個開關開的',另一個就是第三個。
3、兩位盲人問題
他們都各自買了兩對黑襪和兩對白襪,八對襪了的布質、大小完全相同,而每對襪了都有一張商標紙連著。兩位盲人不小心將八對襪了混在一起。 他們每人怎樣才能取回黑襪和白襪各兩對呢?
答案:每一對分開,一人拿一隻,因為襪子不分左右腳的;
4、果凍問題
你有一桶果凍,其中有黃色,綠色,紅色三種,閉上眼睛,同時抓取兩個果凍。抓取多少個就可以確定你肯定有兩個同一顏色的果凍?
答案:2次4個!
5、喝啤酒問題
假如每3個空啤酒瓶可以換一瓶啤酒,某人買了10瓶啤酒,那麼他最多可以喝到多少瓶啤酒?
答案:喝完10瓶後用9個空瓶換來3瓶啤酒(喝完後有4個空瓶)喝完這三瓶又可以換到1瓶啤酒(喝完後有2個空瓶),這時他有2個空酒瓶,如果他能向老闆先借一個空酒瓶,就湊夠了3個空瓶可以換到一瓶啤酒,把這瓶喝完後將空瓶還給老闆就可以了。
所以他最多可以喝10+3+1+1=15瓶
6、三人住旅館
有三個人去住旅館,住三間房,每一間房$10元,於是他們一共付給老闆$30,第二天,老闆覺得三間房只需要$25元就夠了於是叫小弟退回$5給三位客人,誰知小弟貪心,只退回每人$1,自己偷偷拿了$2,這樣一來便等於那三位客人每人各花了九元,於是三個人一共花了$27,再加上小弟獨吞了不$2,總共是$29。可是當初他們三個人一共付出$30那麼還有$1呢?
答案:他們所消費的27元里已經包括小弟的2元了,再加退還的3元=30元。這種題一定不要亂了陣腳,根據一條思路做:這30元現在的分布是:老闆拿25元,伙計拿2元,三人各拿1元,正好!
7、三筐蘋果問題
有三筐水果,一筐裝的全是蘋果,第二筐裝的全是橘子,第三筐是橘子與蘋果混在一起。筐上的標簽都是騙人的,(就是說筐上的標簽都是錯的)你的任務是拿出其中一筐,從裡面只拿一隻水果,然後正確寫出三筐水果的標簽。
答案:從標著「混合」標簽的筐里拿一隻水果,就可以知道另外兩筐裝的是什麼水果了。
分析:從混合的拿出一個來,如果是蘋果,而貼蘋果的筐里有可能是橘子和混合,如果是混合,說明貼橘子的筐里是橘子,不成立(因為前提說了,每個標簽都是錯的)。所以貼蘋果的筐里是橘子,則貼橘子的筐里是混合。
8、汽車加油問題
一輛載油500升的汽車從A開往1000公里外的B,已知汽車每公里耗油量為1升,A處有無窮多的油,其他任何地點都沒有油,但該車可以在任何地點存放油以備中轉,問從A到B最少需要多少油
解答:嚴格證明該模型最優比較麻煩,但確實可證,大膽猜想是解題關鍵。題目可歸結為求數列an=500/(2n 1) n=0,1,2,3......的和Sn什麼時候大於等於1000,解得n>6當n=6時,S6=977.57,所以第一個中轉點離起始位置距離為1000-977.57=22.43公里.所以第一次中轉之前共耗油22.43*(2*7 1)=336.50升此後每次中轉耗油500升,所以總耗油量為7*500 336.50=3836.50升。
9、兩個人猜數問題
教授選出兩個從2到9的數,把它們的和告訴學生甲,把它們的積告訴學生乙,讓他們輪流猜這兩個數, 甲說:「我猜不出」, 乙說:「我猜不出」, 甲說:「我猜到了」, 乙說:「我也猜到了」, 問這兩個數是多少?
解答:3和4。設兩個數為n1,n2,n1> =n2,甲聽到的數為n=n1 n2,乙聽到的數為m=n1*n2,證明n1=3,n2=4是唯一解。證明:要證以上命題為真,不妨先證n=7
1)必要性:
i) n> 5 是顯然的,因為n <4不可能,n=4或者n=5甲都不可能回答不知道
ii) n> 6 因為如果n=6的話,那麼甲雖然不知道(不確定2 4還是3 3)但是無論是2,4還是3,3乙都不可能說不知道(m=8或者m=9的話乙說不知道是沒有道理的)
iii) n <8 因為如果n> =8的話,就可以將n分解成 n=4 x 和 n=6 (x-2),那麼m可以是4x也可以是6(x-2)而4x=6(x-2)的必要條件是x=6即n=10,那樣n又可以分解成8 2,所以總之當n> =8時,n至少可以分解成兩種不同的合數之和,這樣乙說不知道的時候,甲就沒有理由馬上說知道。以上證明了必要性。
2)充分性
當n=7時,n可以分解成2 5或3 4
顯然2 5不符合題意,捨去,容易判斷出3 4符合題意,m=12,證畢
於是得到n=7 m=12 n1=3 n2=4是唯一解。
10、猴子吃香蕉問題
一個小猴子邊上有100 根香蕉,它要走過50 米才能到家,每次它最多搬50 根香蕉,每走1 米就要吃掉一根,請問它最多能把多少根香蕉搬到家裡。
解答:設 小猴從0 走到50, 到A 點時候他可以直接抱香蕉回家了, 可是到A 點時候他至少消耗了3A 的香蕉( 到A, 回0, 到A), 一個限制就是小猴只能抱50 只香蕉, 那麼在A 點小猴最多49 只香蕉.100-3A=49, 所以A=17. 這樣折騰完到家的時候香蕉剩100-3A-(50-A)=50-2A=16.
D. 大廠面試題詳解:如何用Redis實現分布式鎖
說一道常見面試題:
一個很簡單的答案就是去使用 Redission 客戶端。Redission 中的鎖方案就是 Redis 分布式鎖得比較完美的詳細方案。
那麼,Redission 中的鎖方案為什麼會比較完美呢?
正好,我用 Redis 做分布式鎖經驗十分豐富,在實際工作中,也 探索 過許多種使用 Redis 做分布式鎖的方案,經過了無數血淚教訓。
所以,在談及 Redission 鎖為什麼比較完美之前,先給大家看看我曾經使用 Redis 做分布式鎖是遇到過的問題。
我曾經用 Redis 做分布式鎖是想去解決一個用戶搶優惠券的問題。這個業務需求是這樣的:當用戶領完一張優惠券後,優惠券的數量必須相應減一,如果優惠券搶光了,就不允許用戶再搶了。
在實現時,先從資料庫中先讀出優惠券的數量進行判斷,當優惠券大於 0,就進行允許領取優惠券,然後,再將優惠券數量減一後,寫回資料庫。
當時由於請求數量比較多,所以,我們使用了三台伺服器去做分流。
這個時候會出現一個問題:
如果其中一台伺服器上的 A 應用獲取到了優惠券的數量之後,由於處理相關業務邏輯,未及時更新資料庫的優惠券數量;在 A 應用處理業務邏輯的時候,另一台伺服器上的 B 應用更新了優惠券數量。那麼,等 A 應用去更新資料庫中優惠券數量時,就會把 B 應用更新的優惠券數量覆蓋掉。
看到這里,可能有人比較奇怪,為什麼這里不直接使用 SQL:
原因是這樣做,在沒有分布式鎖的協調下,優惠券數量可能直接會出現負數。因為當前優惠券數量為 1 的時候,如果兩個用戶通過兩台伺服器同時發起搶優惠券的請求,都滿足優惠券大於 0 每個條件,然後都執行這條 SQL 說了句,結果優惠券數量直接變成 -1 了。
還有人說可以用樂觀鎖,比如使用如下 SQL:
這種方式就在一定幾率下,很可能出現數據一直更新不上,導致長時間重試的情況。
所以,經過綜合考慮,我們就採用了 Redis 分布式鎖,通過互斥的方式,以防止多個客戶端同時更新優惠券數量的方案。
當時,我們首先想到的就是使用 Redis 的 setnx 命令,setnx 命令其實就是 set if not exists 的簡寫。
當 key 設置值成功後,則返回 1,否則就返回 0。所以,這里 setnx 設置成功可以表示成獲取到鎖,如果失敗,則說明已經有鎖,可以被視作獲取鎖失敗。
如果想要釋放鎖,執行任務 del 指令,把 key 刪除即可。
利用這個特性,我們就可以讓系統在執行優惠券邏輯之前,先去 Redis 中執行 setnx 指令。再根據指令執行結果,去判斷是否獲取到鎖。如果獲取到了,就繼續執行業務,執行完再使用 del 指令去釋放鎖。如果沒有獲取到,就等待一定時間,重新再去獲取鎖。
乍一看,這一切沒什麼問題,使用 setnx 指令確實起到了想要的互斥效果。
但是,這是建立在所有運行環境都是正常的情況下的。一旦運行環境出現了異常,問題就出現了。
想一下,持有鎖的應用突然崩潰了,或者所在的伺服器宕機了,會出現什麼情況?
這會造成死鎖——持有鎖的應用無法釋放鎖,其他應用根本也沒有機會再去獲取鎖了。這會造成巨大的線上事故,我們要改進方案,解決這個問題。
怎麼解決呢?咱們可以看到,造成死鎖的根源是,一旦持有鎖的應用出現問題,就不會去釋放鎖。從這個方向思考,可以在 Redis 上給 key 一個過期時間。
這樣的話,即使出現問題,key 也會在一段時間後釋放,是不是就解決了這個問題呢?實際上,大家也確實是這么做的。
不過,由於 setnx 這個指令本身無法設置超時時間,所以一般會採用兩種辦法來做這件事:
1、採用 lua 腳本,在使用 setnx 指令之後,再使用 expire 命令去給 key 設置過期時間。
2、直接使用 set(key,value,NX,EX,timeout) 指令,同時設置鎖和超時時間。
以上兩種方法,使用哪種方式都可以。
釋放鎖的腳本兩種方式都一樣,直接調用 Redis 的 del 指令即可。
到目前為止,我們的鎖既起到了互斥效果,又不會因為某些持有鎖的系統出現問題,導致死鎖了。這樣就完美了嗎?
假設有這樣一種情況,如果一個持有鎖的應用,其持有的時間超過了我們設定的超時時間會怎樣呢?會出現兩種情況:
出現第一種情況比較正常。因為你畢竟執行任務超時了,key 被正常清除也是符合邏輯的。
但是最可怕的是第二種情況,發現設置的 key 還存在。這說明什麼?說明當前存在的 key,是另外的應用設置的。
這時候如果持有鎖超時的應用調用 del 指令去刪除鎖時,就會把別人設置的鎖誤刪除,這會直接導致系統業務出現問題。
所以,為了解決這個問題,我們需要繼續對 Redis 腳本進行改動……毀滅吧,累了……
首先,我們要讓應用在獲取鎖的時候,去設置一個只有應用自己知道的獨一無二的值。
通過這個唯一值,系統在釋放鎖的時候,就能識別出這鎖是不是自己設置的。如果是自己設置的,就釋放鎖,也就是刪除 key;如果不是,則什麼都不做。
腳本如下:
或者
這里,ARGV[1] 是一個可傳入的參數變數,可以傳入唯一值。比如一個只有自己知道的 UUID 的值,或者通過雪球演算法,生成只有自己持有的唯一 ID。
釋放鎖的腳本改成這樣:
可以看到,從業務角度,無論如何,我們的分布式鎖已經可以滿足真正的業務需求了。能互斥,不死鎖,不會誤刪除別人的鎖,只有自己上的鎖,自己可以釋放。
一切都是那麼美好!!!
可惜,還有個隱患,我們並未排除。這個隱患就是 Redis 自身。
要知道,lua 腳本都是用在 Redis 的單例上的。一旦 Redis 本身出現了問題,我們的分布式鎖就沒法用了,分布式鎖沒法用,對業務的正常運行會造成重大影響,這是我們無法接受的。
所以,我們需要把 Redis 搞成高可用的。一般來講,解決 Redis 高可用的問題,都是使用主從集群。
但是搞主從集群,又會引入新的問題。主要問題在於,Redis 的主從數據同步有延遲。這種延遲會產生一個邊界條件:當主機上的 Redis 已經被人建好了鎖,但是鎖數據還未同步到從機時,主機宕了。隨後,從機提升為主機,此時從機上是沒有以前主機設置好的鎖數據的——鎖丟了……丟了……了……
到這里,終於可以介紹 Redission(開源 Redis 客戶端)了,我們來看看它怎麼是實現 Redis 分布式鎖的。
Redission 實現分布式鎖的思想很簡單,無論是主從集群還是 Redis Cluster 集群,它會對集群中的每個 Redis,挨個去執行設置 Redis 鎖的腳本,也就是集群中的每個 Redis 都會包含設置好的鎖數據。
我們通過一個例子來介紹一下。
假設 Redis 集群有 5 台機器,同時根據評估,鎖的超時時間設置成 10 秒比較合適。
第 1 步,咱們先算出集群總的等待時間,集群總的等待時間是 5 秒(鎖的超時時間 10 秒 / 2)。
第 2 步,用 5 秒除以 5 台機器數量,結果是 1 秒。這個 1 秒是連接每台 Redis 可接受的等待時間。
第 3 步,依次連接 5 台 Redis,並執行 lua 腳本設置鎖,然後再做判斷:
再額外多說一句,在很多業務邏輯里,其實對鎖的超時時間是沒有需求的。
比如,凌晨批量執行處理的任務,可能需要分布式鎖保證任務不會被重復執行。此時,任務要執行多長時間是不明確的。如果設置分布式鎖的超時時間在這里,並沒有太大意義。但是,不設置超時時間,又會引發死鎖問題。
所以,解決這種問題的通用辦法是,每個持有鎖的客戶端都啟動一個後台線程,通過執行特定的 lua 腳本,去不斷地刷新 Redis 中的 key 超時時間,使得在任務執行完成前,key 不會被清除掉。
腳本如下:
其中,ARGV[1] 是可傳入的參數變數,表示持有鎖的系統的唯一值,也就是只有持有鎖的客戶端才能刷新 key 的超時時間。
到此為止,一個完整的分布式鎖才算實現完畢。總結實現方案如下:
這個分布式鎖滿足如下四個條件:
當然,在 Redission 中的腳本,為了保證鎖的可重入,又對 lua 腳本做了一定的修改,現在把完整的 lua 腳本貼在下面。
獲取鎖的 lua 腳本:
對應的刷新鎖超時時間的腳本:
對應的釋放鎖的腳本:
到現在為止,使用 Redis 作為分布式鎖的詳細方案就寫完了。
我既寫了一步一坑的坎坷經歷,也寫明了各個問題和解決問題的細節,希望大家看完能有所收獲。
最後再給大家提個醒,使用 Redis 集群做分布式鎖,有一定的爭議性,還需要大家在實際用的時候,根據現實情況,做出更好的選擇和取捨。
原文 https://www.cnblogs.com/siyuanwai/p/16011836.html
E. 精選程序員面試常問的邏輯題
大家在面試的時候,難免會遇到讓人摸不著頭腦的邏輯題,這類題目讓同學們往往連答案應該回答些什麼都摸不清楚,只能和面試官四目相對,非常尷尬。
其實,很多面試的考官,都是從題庫隨機挑選邏輯題來考驗同學們,面試官有時候自己也未必完全摸透這類題目,所以面試的時候不必過於緊張,就算答不出來啊也非常正常。
在我的理解中,這類題目主要還是考大家的思路,至於答案標准與否,其實不是特別重要。
本文總結了面試中我自己面試中遇到的幾道非常常見的邏輯題,大家可以作為面試前的突擊復習材料。
一群人開舞會,每人頭上都戴著一頂帽子。帽子只有黑白兩種,黑的至少有一頂。每個人都能看到其它人帽子的顏色,卻看不到自己的。主持人先讓大家看看別人頭上戴的是什麼帽子,然後關燈,如果有人認為自己戴的是黑帽子,就打自己一個耳光。第一次關燈,沒有聲音。於是再開燈,大家再看一遍,關燈時仍然鴉雀無聲。一直到第三次關燈,才有劈劈啪啪打耳光的聲音響起。問有多少人戴著黑帽子?
三個人
若是兩個人,設A、B是黑帽子,第二次關燈就會有人打耳光。原因是A看到B第一次沒打耳光,就知道B也一定看到了有帶黑帽子的人,可A除了知道B帶黑帽子外,其他人都是白帽子,就可推出他自己是帶黑帽子的人!同理B也是這么想的,這樣第二次熄燈會有兩個耳光的聲音。
如果是三個人,A,B,C。A第一次沒打耳光,因為他看到B,C都是帶黑帽子的;而且假設自己帶的是白帽子,這樣只有BC戴的是黑帽子;按照只有兩個人帶黑帽子的推論,第二次應該有人打耳光;可第二次卻沒有...於是他知道B和C一定看到了除BC之外的其他人帶了黑帽子,於是他知道BC看到的那個人一定是他,所以第三次有三個人打了自己一個耳光
N個人是黑帽子,就會在第N天,有N個人打自己一個耳光。
一個是兩種葯片,每種有兩個,一個人需要早上吃兩種葯片各一個,現在這四個葯片混在一起了這個人什麼方法吃。
把所有的4顆葯丸都切開成相等的兩半,然後早上和晚上,分別吃掉每顆葯丸的一半
一個5L,一個6L的瓶子,要得到3L的水,問什麼方法
6-5=1 1L水放在5L那個瓶裡面,然後再裝6L水,往5L(裡面已經有1L)裡面倒,這樣就會剩下2L水在6L裡面,再把2L水放在5L裡面,再裝一次,不就可以6L那裡到處3L水到5L裡面,自己就剩下3L了
一共1000瓶酒,其中一瓶有毒。如果一隻老鼠喝了有毒的酒,會在一天之後死亡,那麼如果給你一天時間,然你判定哪瓶酒有毒,至少需要幾只老鼠?
答案是10隻。這個需要使用二進制編碼來解決,1000瓶酒至少需要10位二進制數來進行編碼。然後取十隻杯子分別代表這是個二進制數的十個位,分別將1000瓶酒倒入其編碼為1的對應的杯子中。取十個老鼠分別喝十個杯子中的酒,一天之後,就可以根據喝哪些杯子的老鼠死掉來確定出有毒的那瓶酒的編碼,從而確定哪瓶酒有毒。其根據就是只有有毒酒的編碼對應的毒死老鼠的杯子位置。這個題目就是利用了二進制編碼的一些特性。
還有一些其他的題目也使用這些特性,比如使用特殊的位運算,一般使用比較多的位運算就是與、或和異或。
這樣,就可以對應到現實生活中的一些為題,比如一個類似的問題原本我們想需要用900多台伺服器來解決,經過這樣分析後就可以使用10台伺服器來解決,大大節約了成本。
再比如,國王有10000桶酒,已知一桶酒有毒,喝了之後一定會在23-24小時內死亡(例如0點喝,會在23-第二天0點這個時間段死亡)。現在國王要在48小時後舉辦一個宴會,需要用罪犯實驗,請問最少幾個罪犯。(可以混合酒)
如果是常規利用二進制解題的話,那就需要14個犯人,2^14=16384>10000,但是這樣一來死亡時間這個條件就用不到,也不是最優解。
應該利用酒死的時間是固定的,一個罪犯像上面那樣可以表示成25種狀態,三個罪犯就可以表示25 x 25 x25種狀態,超過10000了,所以只需要三個罪犯。
有8個小球,其中七個的重量是相同的,有一個較輕。給你一個天平,問秤幾次能找出那個較輕的小球,若天平只能秤兩次,又該怎麼秤
第一次兩邊各放隨機三個,如果平了,則另外一個是輕的,若不平,還有第二次,拿出那三個輕的,在兩邊隨機放一個,就能測出哪個最輕了。
本體圖解參考:
https://blog.csdn.net/hinyunsin/article/details/6632062
已知: 每個飛機只有一個油箱,飛機之間可以相互加油(注意是相互,沒有單獨的加油機),一箱油可供一架飛機繞地球飛半圈
問題:為使至少一架飛機繞地球一圈回到起飛時的飛機場,至少需要出動幾架飛機?(所有飛機從同一機場起飛,而且必須安全返回機場,不允許中途降落,中間沒有飛機場)
分為3架飛機5架次和3架飛機6架次
1. 3架飛機6架次
(上圖)ABC 3架同時起飛
(上圖)1/8處,C給AB加滿油,C返航。此時飛機的油量分別是:A: 3/4, B: 3/4, C: 3/4。此時C分別給A和B加滿油,三架飛機當前油量分別是:A: 1, B: 1, C: 1/4。C返回機場。A、B繼續向前飛行。
(上圖)1/4處,B給A加滿油,B返航,A到達1/2處,此時C已經返回機場,三家飛機此時油量分別是:A: 3/4, B: 3/4, C: 0。此時B給A加滿油,C加滿油,此時三架飛機的油量分別是:A: 1, B: 1/2, C: 1。然後B返回機場,A繼續向前飛行。
(上圖)當A飛行至半圈位置時,B已經返回機場並且加滿了油(假設加油時間為0),此時,B和C沿逆時針方向飛行,三架飛機當前油量分別是:A: 1/2, B: 1, C: 1。A繼續向前飛行。
(上圖)當A飛行至另外半圈的1/4位置時,三架飛機剩餘油量分別是:A: 1/4, B: 3/4, C: 3/4。此時,C給B加滿油。此時三架飛機油量分別是:A: 1/4, B: 1, C: 1/2。C返回機場,B和A繼續向前飛行。
當A飛行至另外半圈的1/2位置時,C已經返回機場,A和B相遇,此時三架飛機剩餘油量分別是:A: 0, B: 3/4, C: 0。B給A加1/4的油,三架飛機剩餘油量:A: 1/4, B: 1/2, C: 1。C加滿油從機場逆時針飛出,B返回機場,A繼續向前飛行。
(上圖)當A飛行至另外半圈的3/4位置時,A和C相遇。此時三架飛機的油量分別是:A: 0, B: 1/4, C: 3/4。C給A加1/4的油,此時三架飛機的油量分別是:A: 1/4, B: 1/4, C: 1/2。C掉頭返回機場,A和B繼續向前飛行。
(上圖)三架飛機順利回到機場!
2. 3飛機5架次
(1)3 架飛機同時從機場出發,飛行八分之一周(A點),各耗油四分之一。此時某架飛機給其餘兩架補滿油,自己返回基地;
(2)另一架飛機和目標機結伴,飛至四分之一周(B點),給目標機補滿油,自己返回;
(3)目標機獨自飛行半周(C點);
(4)與從基地反向出發的一架飛機相遇,2 機將油平分,飛至最後八分之一處(D點);
(5)與從基地反向出發的另一機相遇,各分四分之一油,返回。
75道程序員面試邏輯題和答案
https://blog.csdn.net/qq_38361726/article/details/79824632
F. 程序員面試如何介紹自己優缺點
程序員面試一直是大家討論的熱門話題。那麼程序員面試如何介紹自己優缺點呢?下面是我給大家整理的程序員面試如何介紹自己優缺點,供大家參閱!
關於優點:
優點是一個相對好回答的問題,每一個人身上都有很多優點,比如細心、適應能力強、善於學習等等。需要提醒大家的是,要盡可能說一些和工作相關的優點,比如孝順、體貼之類的就不要說啦,可以講一些諸如“不滿足於現狀”之類的話,別把自己誇的太玄乎讓面試官覺著你太自大就好。
切記的是,一定要舉例子啊同學們。不要和面試官直接了當的回答“我不滿足於現狀”然後等著他問“比如呢?”,這樣就顯得太高冷了,要像說故事一樣的舉出一些不那麼泛泛的例子,比如:“對自己的能力總是不滿足,會去主動嘗試學習一些新的東西。高中的時候英語成績突出,經常能考到140分以上,但是我並沒有滿足,利用假期考了雅思,成績也還不錯,雖然不出國,但是當做是對自己的一種挑戰,很有成就感。”
是不是感覺有那麼一點賤賤的?這類問題本身就是這樣,你需要的是准備一個你覺著自己還不錯的優點,然後講一段別太長又讓人感覺還算真實的故事,就OK了,不需要多出彩,但至少不要為自己減分就好。
給大家一些回答的比較好的:
1. 給自己定下較高的目標並按部就班的實現(可用高考、考研、留學等經歷來說明)
2. 同時具有理性思考又有感性和美學的感受力(可以用為什麼選擇建築、交互設計等專業來說明。
可以參考這些答案自己准備一些回答,這個問題是沒有標准答案的。
關於缺點:
這是一個比較難回答的問題,答得太淺太泛會讓人覺著你不能很好的正視自己的缺點,答得太深太真實又會一不小心踩到雷區說到禁忌。一些求職培訓機構給了大家一個看似聰明而又標准化的回答,“追求完美、偏執狂“等等,但是,小鷹想告訴大家的是,這個答案已經在5年前就被用爛了,除非你真的是這樣,並且能舉出一個極具說服力的例子,否則就不要用了。換位思考,如果你是面試官你會相信追求完美是最大的缺點嗎?別以為把優點說成缺點就是最聰明的回答,很多時候會讓面試官覺著你油嘴滑舌,是在故意討巧。那應該如何正確的回答這個問題呢?
首先,要知道哪些是雷區,是一定不能說的缺點,比如:懶、脾氣古怪、不喜歡合作等等,這就好比說自己“貪嗔痴”一樣,是人性的弱點,但是不能在面試中說啊寶貝。在大雷區下,還有一些小雷區,就是針對特定職業的。如果你應聘的是會計,你就不能說自己不拘小節;如果你應聘銷售,就不能說自己缺點是內向、不善言辭;如果你是設計師,不能說自己缺乏創新精神等等。
其次,不要去談和工作不相關的缺點,比如潔癖、廚藝不好、挑食等等,別笑,真的有人這么回答。但是你覺著面試官花時間面試你是想聽你嘮家常么?同樣不要去談那些不痛不癢的缺點,比如熬夜會困、不善於理財,這種答案說出來會讓覺著不知道接什麼好,又渾身癢癢,所以還是不要說了。
第三,不要說那些無法改善的缺點,比如一看書就困、算數必須用計算器,這種缺點本身很正常,要是每個人的缺點都能改善都成完人了,但是在面試里拿出來說就是你的不對了,會讓面試官覺著“你的這些頑疾既然得不到改善那我乾脆不用你好了”。
所以,到底要怎麼回答呢?!
在避免以上幾點的前提下,要在說出缺點後談談你正在或者即將要如何改進這個缺點。小鷹再重申一下,“優點和缺點“的問題是考察大家的自我認知,如果你最大的缺點是“拖延”,然後你明知道這是你最大的問題又不改,是鬧哪樣呢?會讓面試官覺著你是一個不思進取的人。所以,既然是考察自我認知,對於缺點問題最好的回答,應該是你知道自己的缺點並去改正它的過程,然後講一個真實又動聽的故事,就可以順利過關了。
一些比較好的回答:
1. 有時候把任務布置給別人,覺著不放心或者達不到自己的要求,會去親力親為,所以盡管最後項目完成的不錯,但是可能會搞得自己特別疲憊,有時候也會影響到同伴的積極性。所以正在努力改進,會在事情開始前先和同伴統一目標和標准,然後分別執行,最後一起討論…
2. 喜歡追求細節導致項目/作業未能按期完成。通過時間管理能力改變工作方式,先完成框架再改善細節得以解決…
3. 不知如何拒絕,同事要求幫忙一概攬下,影響自身工作進度。通過多任務處理能力設定優先順序,以該優先順序表向求助同事展示自己手上工作,並給其一個自己在何時可以給予幫助的時間估計,讓求助人自行決定是否求助,問題解決。
在很多求職者的眼中,面試官 就像野獸看到獵人一樣?一提到面試官,我們就像到可怕的主考官和令人絕望的口試。我們又總是把面試想像成為充滿敵意的情景,自己是被動的犧牲品,被嚴厲的陌生考官擺弄來擺弄去。我們還把面試描繪成是世上所有的壞心眼人都聚集在一個陌生城市的一間陌生屋子裡,在這間屋子裡我們將遭遇到氣勢洶洶的陌生人向我們提出一些我們根本回答不了的問題。
其實,處理面試這一問題的方法就好比將糖化在茶里一樣簡單。如果你把這個問題包袱一樣帶到面試場上去,那你活該受罪,尤其是受罪的部分原因是你事先沒有花足夠的時間思考、計劃並准備你的應試策略和預先排演。因為你是否被錄取在你的形象和聲譽上,所以在積極思考對策預先排演上線點功夫是值得的。如果你被列入了供最後挑選用的候選人名單,這表示有人已經認為你可能勝任這份工作了,之後你將被約見來?
盤算你是否“合適 ”
檢驗你的自信程度,是否因為緊張而失態;
看看你是否能成功地推銷自己一一以觀察你的自控程度和模擬狀態下你到底有多少“貨”
為什麼有的後現任沒做什麼准備就冒然前往參加面試了?原因可能是多種多樣的,可能是因為他們不知道該准備些什麼,或者知道該准備些什麼卻不知道該怎麼准備,或者是沒有發現做點准備的必要性。所以,在這種情況下,參加面試前的第一步工作,最好事寫一封信,確認一下面試的安排,這樣顯得自己很是老道。
一、准備工作
簡單寫幾句話,陳述面試的意圖,並經常提醒自己。准備介紹自己的文字材料 、你的觀念信仰、個人簡歷,以及自己合適這份工作的理由。陳述要實事求是不自吹自擂,並巨額寫實例和證明來增加陳述的可信度,不妨試試用這樣的話開頭的句子:“我有個很好的名聲,那就是、、、”我的同事們告訴我,說我、、、
二、制定計劃
想一想自己想從面試中得到什麼,就面試准備和對策研究作出書面計劃,對面試當天也要制定計劃,以免貼貼撞撞地前往或丟三落四。安排好交通辦法。
三、對策研究
對於對方提供的參觀該單位,或就該這份工作非正式地談點什麼這種機會,千萬不要錯過。試著多了解一點該單位:其聲譽如何?財政狀況如何?誰是面試官?面試時間將會持續多久?面試時間?地點?設計一條前往面試的最佳路線。如果要過夜,往哪裡?坐火車或大的要多少錢?如果面試中還包括要你做一段演示,那就檢查一下你的聲像設備是否完好。
預先排練
向任何一人願意充當你的觀眾一一朋友、嫁人、或者貓一一排演一下你的設計思路對你的回答計一下時間,除了非常復雜的問題外,一般情況下的回答都沒有必要超過一分半鍾,按每分鍾120個字的平均水平計算, 你可以將180字,這足以讓你作出清楚而精確的表達了。聯系如何在講30秒後就表達出中心已死。聯系如何用故事、實例和軼事來生動地講述 你的經歷。不要誇大或淡化你的成功得意之處。對自己的失誤要誠實,但也要清楚地說明自己從中得到了什麼教訓。聯系不要太多,只要能使自己對要說的話較為熟悉即可,這樣在面試時你會感到很舒服,聽起來也自然而然。
其實面試是一個展示你才能的極好機會,可別浪費了!
很奇怪,有許多人從如何面試失敗這方面作準備、、、竭力相處自己不應該接受這份工作的所有理由。我們稱之為,假腿。最常見的假腿包括:
我得不到這份工作。理由是:
我年紀太大或小
我自個太老或嫩
我經驗不足或少
我在目前的崗位上工作的時間太短
提示?面試候選人的致命點是“嘮嘮叨叨、長篇大論、炫耀自己,只說不聽。
G. 程序員面試的時候考官一般問什麼問題
基本問題
主要包括介紹自己。學歷工作經驗家庭住址等
業務問題
按你應聘的崗位進行詢問,看你了解多少,或者你的態度
綜合問題
主要看你對待工作的態度,為人等問題。