㈠ 程序員面試問題及答案
程序員面試問題及答案
程序員是從事程序開發、維護的專業人員。我整理的程序員面試問題及答案,希望大家喜歡!
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.
㈡ 精選程序員面試常問的邏輯題
大家在面試的時候,難免會遇到讓人摸不著頭腦的邏輯題,這類題目讓同學們往往連答案應該回答些什麼都摸不清楚,只能和面試官四目相對,非常尷尬。
其實,很多面試的考官,都是從題庫隨機挑選邏輯題來考驗同學們,面試官有時候自己也未必完全摸透這類題目,所以面試的時候不必過於緊張,就算答不出來啊也非常正常。
在我的理解中,這類題目主要還是考大家的思路,至於答案標准與否,其實不是特別重要。
本文總結了面試中我自己面試中遇到的幾道非常常見的邏輯題,大家可以作為面試前的突擊復習材料。
一群人開舞會,每人頭上都戴著一頂帽子。帽子只有黑白兩種,黑的至少有一頂。每個人都能看到其它人帽子的顏色,卻看不到自己的。主持人先讓大家看看別人頭上戴的是什麼帽子,然後關燈,如果有人認為自己戴的是黑帽子,就打自己一個耳光。第一次關燈,沒有聲音。於是再開燈,大家再看一遍,關燈時仍然鴉雀無聲。一直到第三次關燈,才有劈劈啪啪打耳光的聲音響起。問有多少人戴著黑帽子?
三個人
若是兩個人,設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
㈢ 程序員應該怎樣去面試 程序員面試注意事項
程序員面試注意事項如下。
1、呈現出自己完整的知識結構。
對於程序員來說,最重要的一件事情就是在短短的面試過程中呈現出自己完整的知識結構。要想做到這一點,一定要在自我介紹的過程中下足功夫,既簡練又豐富,引起面試官的重視。
2、重視項目經驗的介紹。
無論是應聘初級程序員還是主力程序員,項目經驗都是面試官最為關注的內容之一,也是面試者能力的衡量標准之一。在項目介紹的時候要選擇比較有代表性的項目,簡單的說就是規模越大越好,參與程度越深越好。能夠清晰的描述自己在項目中的工作職責和最終的完成情況。
3、重視解決問題的能力。
通過一個具體的難點問題如何解決來呈現自己解決問題的能力,這種做法更有說服力,而且盡量突出重點內容,比如演算法設計、實現過程、驗證過程等內容,解決問題的能力是主力程序員的核心競爭力之一。
4、突出自己的學習能力。
程序員在整個職業生涯中需要不斷的學習,因為整個IT領域的技術更新速度是比較快的,面試官往往對程序員的學習能力比較關注,可以通過不同的項目採用不同的技術方案來體現自己較強的學習能力。
5、體現出自己的交流能力。
交流能力對於程序員來說也是非常重要的,項目開發過程中需要頻繁的交流,所以交流能力也是面試官比較關注的方面之一。體現交流能力的關鍵是把握住交流的主線,所有的思路要緊緊圍繞核心問題,盡量不要做過多的擴展,這樣容易顧此失彼。
6、描述自己的職業規劃。
一個好的職業規劃會給面試官留下一個好印象,也會為自己爭取到更好的職位奠定一個基礎。
㈣ 程序員人品面試題及答案,HR必備!
在我們招聘技術的時候,如果只是一個面試官面試,通常會遇到,面試管徇私舞弊,類似狗眼看人低,或者遇到高手心存嫉妒不願招聘此人的情況,從而剔除掉面試的人才,無法有效招聘到公司所需的人。
如何避免面試人員的徇私舞弊,就至關重要,我們統長可以通過加試的流程,或者加面的流程來規避這種事情,通常情況下,我們也可以通過筆試+面試+面試2的流程進行,這樣的環節越多,面試官徇私舞弊的問題就越少,對於重要的崗位我們依然要綜合考慮清晰,不能讓人品差的人混入。
1.排擠或者拉幫結派,在公司內部製造不和睦的情景。
2.影響公司的正常運營,還可能存在貪污腐敗像閑。
3.可以吃回扣的崗位,尤其是采購會給公司造成重大的損失。
對此我總結和個人的經驗,整理如下的10個人品測試題,每小題10分共100分,同樣的您可以和技術題混合在一起對求職者進行這樣的筆試。
如果A是您的直屬領導,當遇到了緊急情況,且你正在忙手頭要緊事,需要你的協助或者幫助時你會怎麼做?( )
A.盡力而為 B.手上工作忙,會建議找別人 C.我沒有必要幫助他人 D.放下手頭要緊的事,去協助領導
答案:B
解析:作為領導,和下屬都屬於公司員工,沒有誰更加需要幫助,只有自己的工作職責,和同事之間的互幫互助行為,二遇到這種事,應是優先做好的自己的事,再去幫助他人,選A的人是屬於,阿諛奉承拍馬屁的類型,選C的人是極度理性,且規規矩矩的人,選D的人是屬於,斜度個人工作職責的行為。
如果A是您的直屬領導,他今天搬家,告訴你去他家裡幫忙,他這種行為屬於?( )
A.徇私舞弊 B.私事公辦 C.小氣 D.欺負員工
答案:B
解析:作為領導,搬家時個人私事,不能要求任何的員工幫忙,且給錢也不行,這種行為屬於私事公辦。
直屬的領導,再一次工作失誤後,果斷甩鍋下屬,且指責有續,領導的這種行為是否屬於正常范疇,遇到這種的事情,領導最好應該怎麼做?
簡答題:兩問,行為和怎麼做。
在公共場所,因為瑣事辱罵他人或者領導,這種行為屬於什麼行為,是否違法,能否維權?
簡答題:三問,行為、違法和如何維權,主要考的求職者對法律和道德的認知。
當你下班途中,遇到一個摔倒的老人,這附近有很多碰瓷的傳聞,且沒有攝像頭和路人,這時候你會怎麼做?
A.默默路過,並報警。 B.先報警,然後扶起老人 C.錄視頻,且報警,扶起老人 D.回去叫人
答案:C
解析:只有C是最好的處理方式,且能體現出這位求職者的心思縝密。
如果以後你面試新人,遇到一個能力特別強的人,但沒有學歷,且人說話很沖,工作能力完全過關,你會向領導反應錄取他嘛?()
A.不會,沒學歷 B.可能對我有影響,拒絕錄用 C.繼續等待其他合適人選 D.和領導與同事商議後錄用
答案:D
解析:
選A的人可以看出這不是一個好的員工。公司是一個商業組織,目的是為了盈利,能力強的人往往求之不得,不能因為學歷問題剔除。
選B的人可以看出這是一個小氣,且人品和眼界都很低的員工,建議直接pass,後續對公司的發展也不好。
選C的人可以看出是個負責任的員工,會選擇繼續等待更合適的人選。
在你身上發生了一件事,並不是丑聞,也不是壞事,就是一件很平常的事情,這時你會覺得?()
A.自己是焦點 B.不想去上班 C.自己丟人了 D.散布的這個人真可惡 E.平平淡淡
答案:E
解析:有心理疾病的人,才會覺得自己是焦點,才會有負面情緒。
如果你是個技術大牛,且領導要求你必須教導其他人,你會怎麼做?()
A.熱心是不需要強迫的,會不代表一定要交
B.不聽從領導的話
C.要求公司給予,教導他人的費用。
D.接受領導的要求去教人。
答案:C
解析:技術是自己的,屬於個人,不屬於公司,且教不教不需要強制,強制屬於違法行為,懂得不代表義務教導,這屬於行為綁架的行為。
領導一直強制你做事,且必須你做,出了事就甩鍋給你,你會怎麼做?()
A.辭職不幹 B.向更高領導舉報 C.果斷拒絕 D.頂撞領導
答案:B A
解析:有這樣愛甩鍋的公司領導,也不是什麼好公司,在這里工作不是勾心鬥角就是你爭我奪,故此B和A都是對的。
假如你遇到困難,你不想得到別人的幫助,但是就是有人要幫你,這種行為屬於什麼行為?()
A.強人所難 B.太過熱心 C.不考慮其他人感受 D.不尊重我的主觀意圖
答案:A B C D
解析:這是多選題,都對,別人不需要那麼就應該尊重別人,即使是送黃金,也會有人不需要的時候,不需要而自以為是強迫別人接受,就屬於強人所難,不考慮其他人感受,不尊重個人主觀意圖。
㈤ c++經典面試題及答案
1. C++的類和C裡面的struct有什麼區別?
struct成員默認訪問許可權為public,而class成員默認訪問許可權為private
2. 析構函數和虛函數的用法和作用
析構函數是在對象生存期結束時自動調用的函數,用來釋放在構造函數分配的內存。
虛函數是指被關鍵字virtual說明的函數,作用是使用C++語言的多態特性
3. 全局變數和局部變數有什麼區別?是怎麼實現的?操作系統和編譯器是怎麼知道的?
1) 全局變數的作用用這個程序塊,而局部變數作用於當前函數
2) 前者在內存中分配在全局數據區,後者分配在棧區
3) 生命周期不同:全局變數隨主程序創建和創建,隨主程序銷毀而銷毀,局部變數在局部函數內部,甚至局部循環體等內部存在,退出就不存在
4) 使用方式不同:通過聲明後全局變數程序的各個部分都可以用到,局部變數只能在局部使用
4. 有N個大小不等的自然數(1–N),請將它們由小到大排序.要求程序演算法:時間復雜度為O(n),空間復雜度為O(1)。
void sort(int e[], int n)
{
int i;
int t;
for (i=1; i {
t = e[e[i]];
e[e[i]] = e[i];
e[i] = t;
}
}
5. 堆與棧的去區別
A. 申請方式不同
Stack由系統自動分配,而heap需要程序員自己申請,並指明大小。
B. 申請後系統的響應不同
Stack:只要棧的剩餘空間大於申請空間,系統就為程序提供內存,否則將拋出棧溢出異常
Heap:當系統收到程序申請時,先遍歷操作系統中記錄空閑內存地址的鏈表,尋找第一個大於所申請空間的堆結點,然後將該結點從空間結點鏈表中刪 除,並將該結點的空間分配給程序。另外,大多數系統還會在這塊內存空間中的首地址處記錄本次分配的大小,以便於delete語句正確釋放空間。而且,由於 找到的堆結點的大小不一定正好等於申請的大小,系統會自動將多餘的那部分重新放入空閑鏈表。
C. 申請大小限制的不同
Stack:在windows下,棧的大小是2M(也可能是1M它是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。
Heap:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。
D. 申請效率的比較:
棧由系統自動分配,速度較快。但程序員是無法控制的。
堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便。
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,他不是在堆,也不是在棧是直接在進程的地址空間中保留一快內存,雖然用起來最不方便。但是速度快,也最靈活。
E. 堆和棧中的存儲內容
棧:在函數調用時,第一個進棧的是主函數中後的下一條指令(函數調用語句的下一條可執行語句)的地址,然後是函數的各個參數,在大多數的C編譯器 中,參數是由右往左入棧的,然後是函數中的局部變數。注意靜態變數是不入棧的。當本次函數調用結束後,局部變數先出棧,然後是參數,最後棧頂指針指向最開 始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。
堆:一般是在堆的.頭部用一個位元組存放堆的大小。堆中的具體內容有程序員安排。
6. 含參數的宏與函數的優缺點
宏: 優點:在預處理階段完成,不佔用編譯時間,同時,省去了函數調用的開銷,運行效率高
缺點:不進行類型檢查,多次宏替換會導致代碼體積變大,而且由於宏本質上是字元串替換,故可能會由於一些參數的副作用導致得出錯誤的結果。
函數: 優點:沒有帶參數宏可能導致的副作用,進行類型檢查,計算的正確性更有保證。
缺點:函數調用需要參數、返回地址等的入棧、出棧開銷,效率沒有帶參數宏高
PS:宏與內聯函數的區別
內聯函數和宏都是在程序出現的地方展開,內聯函數不是通過函數調用實現的,是在調用該函數的程序處將它展開(在編譯期間完成的);宏同樣是;
不同的是:內聯函數可以在編譯期間完成諸如類型檢測,語句是否正確等編譯功能;宏就不具有這樣的功能,而且宏展開的時間和內聯函數也是不同的(在運行期間展開)
7. Windows程序的入口是哪裡?寫出Windows消息機制的流程
Windows程序的入口是WinMain()函數。
Windows應用程序消息處理機制:
A. 操作系統接收應用程序的窗口消息,將消息投遞到該應用程序的消息隊列中
B. 應用程序在消息循環中調用GetMessage函數從消息隊列中取出一條一條的消息,取出消息後,應用程序可以對消息進行一些預處理。
C. 應用程序調用DispatchMessage,將消息回傳給操作系統。
D. 系統利用WNDCLASS結構體的lpfnWndProc成員保存的窗口過程函數的指針調用窗口過程,對消息進行處理。
8. 如何定義和實現一個類的成員函數為回調函數
A.什麼是回調函數?
簡而言之,回調函數就是被調用者回頭調用調用者的函數。
使用回調函數實際上就是在調用某個函數(通常是API函數)時,將自己的一個函數(這個函數為回調函數)的地址作為參數傳遞給那個被調用函數。而該被調用函數在需要的時候,利用傳遞的地址調用回調函數。
回調函數,就是由你自己寫的,你需要調用另外一個函數,而這個函數的其中一個參數,就是你的這個回調函數名。這樣,系統在必要的時候,就會調用你寫的回調函數,這樣你就可以在回調函數里完成你要做的事。
B.如何定義和實現一個類的成員函數為回調函數
要定義和實現一個類的成員函數為回調函數需要做三件事:
a.聲明;
b.定義;
c.設置觸發條件,就是在你的函數中把你的回調函數名作為一個參數,以便系統調用
如:
一、聲明回調函數類型
typedef void (*FunPtr)(void);
二、定義回調函數
class A
{
public:
A();
static void callBackFun(void) //回調函數,必須聲明為static
{
cout<<"callBackFun"<
}
virtual ~A();
};
三、設置觸發條件
void Funtype(FunPtr p)
{
p();
}
void main(void)
{
Funtype(A::callBackFun);
}
C. 回調函數與API函數
回調和API非常接近,他們的共性都是跨層調用的函數。但區別是API是低層提供給高層的調用,一般這個函數對高層都是已知的;而回調正好相反, 他是高層提供給底層的調用,對於低層他是未知的,必須由高層進行安裝,這個安裝函數其實就是一個低層提供的API,安裝後低層不知道這個回調的名字,但它 通過一個函數指針來保存這個回調函數,在需要調用時,只需引用這個函數指針和相關的參數指針。
其實:回調就是該函數寫在高層,低層通過一個函數指針保存這個函數,在某個事件的觸發下,低層通過該函數指針調用高層那個函數。
㈥ 程序員經典面試題:並發,容易帶來哪些問題
編程對於很多人來說,還是比較好上手的。當你學會了一門語言,可以編寫一些程序了,很快就會遇到一道坎,並發編程,單線程下好好跑著的程序,怎麼就運行異常了?怎麼就得不到期望的結果。在面試中,並發編程也是經常出現,我們今天來討論一個問題, 並發編程,容易出哪些問題?
相信大家在學習並發編程的時候,都會遇到這樣一個經典問題,有一個函數,執行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.循環等待,線程之前存在一個環路。
那麼,如何解決死鎖的問題呢?既然出現死鎖需要同時滿足上面的幾個條件,那麼,我們只要破壞其中一個條件,就能夠避免死鎖問題。
今天,我們了解到並發編程帶來的問題與解決方案,希望對你在平時的工作或者面試有所幫助。
㈦ 程序員技術面試中,當面試官問「你還有什麼問題」,應該怎麼回答
應聘程序員,在技術面試的時候,結束時面試官通常會問一個問題:你還有什麼問題嗎?眾所周知,面對這個問題不能直接說沒問題了,因為這是你掰回一句或者加深認可的好機會。但是下面這4個問題在技術面試時最好不要問:
1、「我能拿多少工資?」
注意你參加的是技術面試,盡量不要問跟技術不相關的東西,這在技術面試的過程中是一個減分項。一般面試官如果對你有興趣會主動地詢問你的理想薪資。
2、「五險一金有沒有?交通補助有沒有?」
這個問題一般不建議去問,這些問題在技術面試後人事會主動告訴你或者自己主動去詢問人事都可以的,但是在技術面試官面前,問這些跟他本職工作沒有關系的問題會讓面試官覺得不耐煩。
3、「公司經常加班嗎?」
作為開發人員加班的情況肯定是會有的,只是經不經常可能得看公司的實際情況。在面試時問這個問題你可能只是想了解一下公司的加班情況,但卻會讓面試官質疑你的抗壓能力,給面試留下不好的印象。
4、「您覺得我今天能面上嗎?」
有些小夥伴可能急於求職,所以會有些迫切地問這個問題。如果面試官覺得你有希望肯定會給你一些信號,如果面試官不看好你,問這個問題可能讓雙方都比較尷尬。
上面說了4個不該問的問題, 那在面試官問「你還有什麼問題嗎?」時應該問一些什麼問題?
再次點題,在技術面試最好提跟技術相關或跟本職工作相關的的問題。第一,可以問一下關於產品的問題,比如一下產品用的什麼技術,想回去了解一下,或者關於一些新的技術比如大數據、spring boot公司是怎麼用的。這些問題既能讓面試官有興趣回答,又能展現你的知識面。
㈧ android面試題及答案
android面試題及答案
本文是我精心整理的android面試題及答案,歡迎大家參考。
1. 下列哪些語句關於內存回收的說明是正確的? (b ) A、 程序員必須創建一個線程來釋放內存
B、 內存回收程序負責釋放無用內存
C、 內存回收程序允許程序員直接釋放內存
D、 內存回收程序可以在指定的時間釋放內存對象
2. 下面異常是屬於Runtime Exception 的是(abcd)(多選) A、ArithmeticException
B、IllegalArgumentException
C、NullPointerException
D、BufferUnderflowException
3. Math.round(11.5)等於多少(). Math.round(-11.5)等於多少(c). c A、11 ,-11 B、11 ,-12 C、12 ,-11 D、12 ,-12
4. 下列程序段的輸出結果是:(b )
void complicatedexpression_r(){
int x=20, y=30;
boolean b;
b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60;
System.out.println(b);
}
A、true B、false C、1 D、011.activity
5. 對一些資源以及狀態的操作保存,最好是保存在生命周期的哪個函數中進行(d) A、onPause() B、onCreate() C、 onResume() D、onStart()
6. Intent傳遞數據時,下列的數據類型哪些可以被傳遞(abcd)(多選) A、Serializable B、charsequence C、Parcelable D、Bundle
7. android 中下列屬於Intent的作用的是(c) A、實現應用程序間的數據共享
B、是一段長的生命周期,沒有用戶界面的程序,可以保持應用在後台運行,而不會因為切換頁面而消失
C、可以實現界面間的切換,可以包含動作和動作數據,連接四大組件的紐帶
D、處理一個應用程序整體性的工作
8. 下列屬於SAX解析xml文件的優點的是(b) A、將整個文檔樹在內存中,便於操作,支持刪除,修改,重新排列等多種功能
B、不用事先調入整個文檔,佔用資源少
C、整個文檔調入內存,浪費時間和空間
D、不是長久駐留在內存,數據不是持久的,事件過後,若沒有保存數據,數據就會
消失
9. 下面的對自定style的方式正確的是
A、
B、
C、
fill_parent
D、
fill_parent
10. 在android中使用Menu時可能需要重寫的方法有(ac)。(多選) A、onCreateOptionsMenu()
B、onCreateMenu()
C、onOptionsItemSelected()
D、onItemSelected()
11. 在SQL Server Management Studio 中運行下列T-SQL語句,其輸出值(c)。 SELECT @@IDENTITY
A、 可能為0.1
B、 可能為3
C、 不可能為-100
D、 肯定為0
12. 在SQL Server 2005中運行如下T-SQL語句,假定SALES表中有多行數據,執行查詢之 後的結果是(d)。 BEGIN TRANSACTION A
Update SALES Set qty=30 WHERE qty<30
BEGIN TRANSACTION B
Update SALES Set qty=40 WHEREqty<40
Update SALES Set qty=50 WHEREqty<50
Update SALES Set qty=60 WHEREqty<60
COMMITTRANSACTION B
COMMIT TRANSACTION A
A、SALES表中qty列最小值大於等於30
B、SALES表中qty列最小值大於等於40
C、SALES表中qty列的數據全部為50
D、SALES表中qty列最小值大於等於60
13. 在android中使用SQLiteOpenHelper這個輔助類時,可以生成一個資料庫,並可以對資料庫版本進行管理的方法可以是(ab) A、getWriteableDatabase()
B、getReadableDatabase()
C、getDatabase()
D、getAbleDatabase()
14. android 關於service生命周期的onCreate()和onStart()說法正確的是(ad)(多選題) A、當第一次啟動的時候先後調用onCreate()和onStart()方法
B、當第一次啟動的時候只會調用onCreate()方法
C、如果service已經啟動,將先後調用onCreate()和onStart()方法
D、如果service已經啟動,只會執行onStart()方法,不在執行onCreate()方法
15. 下面是屬於GLSurFaceView特性的是(abc)(多選) A、管理一個surface,這個surface就是一塊特殊的內存,能直接排版到android的視圖
view上。
B、管理一個EGL display,它能讓opengl把內容渲染到上述的surface上。
C、讓渲染器在獨立的線程里運作,和UI線程分離。
D、可以直接從內存或者DMA等硬體介面取得圖像數據
16. 下面在AndroidManifest.xml文件中注冊BroadcastReceiver方式正確的
A、
android:name="android.provider.action.NewBroad"/>
B、
android:name="android.provider.action.NewBroad"/>
C、
android:name="android.provider.action.NewBroad"/>
D、
android:name="android.provider.action.NewBroad"/>
17. 關於ContenValues類說法正確的是(a) A、他和Hashtable比較類似,也是負責存儲一些名值對,但是他存儲的名值對當中的
名是String類型,而值都是基本類型
B、他和Hashtable比較類似,也是負責存儲一些名值對,但是他存儲的名值對當中的
名是任意類型,而值都是基本類型
C、他和Hashtable比較類似,也是負責存儲一些名值對,但是他存儲的名值對當中的
名,可以為空,而值都是String類型
D、他和Hashtable比較類似,也是負責存儲一些名值對,但是他存儲的名值對當中
的名是String類型,而值也是String類型
18. 我們都知道Hanlder是線程與Activity通信的橋梁,如果線程處理不當,你的機器就會變得越慢,那麼線程銷毀的方法是(a) A、onDestroy()
B、onClear()
C、onFinish()
D、onStop()
19. 下面退出Activity錯誤的方法是(c) A、finish()
B、拋異常強制退出
C、System.exit()
D、onStop()
20. 下面屬於android的動畫分類的有(ab)(多項) A、Tween B、Frame C、Draw D、Animation
21. 下面關於Android dvm的進程和Linux的進程,應用程序的進程說法正確的是(d) A、DVM指dalivk的虛擬機.每一個Android應用程序都在它自己的進程中運行,不一定擁有一個獨立的Dalvik虛擬機實例.而每一個DVM都是在Linux中的一個進程,所以說可以認為是同一個概念.
B、DVM指dalivk的虛擬機.每一個Android應用程序都在它自己的進程中運行,不一定擁有一個獨立的Dalvik虛擬機實例.而每一個DVM不一定都是在Linux中的一個進程,所以說不是一個概念.
C、DVM指dalivk的虛擬機.每一個Android應用程序都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機實例.而每一個DVM不一定都是在Linux中的一個進程,所以說不是一個概念.
D、DVM指dalivk的虛擬機.每一個Android應用程序都在它自己的進程中運行,都擁有一個獨立的 Dalvik虛擬機實例.而每一個DVM都是在Linux中的一個進程,所以說可以認為是同一個概念.
22. Android項目工程下面的assets目錄的作用是什麼bA、放置應用到的圖片資源。
B、主要放置多媒體等數據文件
C、放置字元串,顏色,數組等常量數據
D、放置一些與UI相應的布局文件,都是xml文件
23. 關於res/raw目錄說法正確的是(a)A、 這里的文件是原封不動的存儲到設備上不會轉換為二進制的格式
B、這里的'文件是原封不動的存儲到設備上會轉換為二進制的格式
C、 這里的文件最終以二進制的格式存儲到指定的包中
D、這里的文件最終不會以二進制的格式存儲到指定的包中
24. 下列對android NDK的理解正確的是(abcd )A、 NDK是一系列工具的集合
B、 NDK 提供了一份穩定、功能有限的 API 頭文件聲明。
C、 使 「java+C」 的開發方式終於轉正,成為官方支持的開發方式
D、 NDK 將是 Android 平台支持 C 開發的開端
二.文件存儲方式
三.SQLite資料庫方式
四.內容提供器(Content provider)方式
二、Android面試填空題
25. android中常用的四個布局是framlayout,linenarlayout,relativelayout和tablelayout。26. android 的四大組件是activiey,service,broadcast和contentprovide。27. java.io包中的objectinputstream和objectoutputstream類主要用於對對象(Object)的讀寫。28. android 中service的實現方法是:startservice和bindservice。29. activity一般會重載7個方法用來維護其生命周期,除了onCreate(),onStart(),onDestory() 外還有onrestart,onresume,onpause,onstop。30. android的數據存儲的方式sharedpreference,文件,SQlite,contentprovider,網路。31. 當啟動一個Activity並且新的Activity執行完後需要返回到啟動它的Activity來執行 的回調函數是startActivityResult()。32. 請使用命令行的方式創建一個名字為myAvd,sdk版本為2.2,sd卡是在d盤的根目錄下,名字為scard.img, 並指定屏幕大小HVGA.____________________________________。33. 程序運行的結果是:_____good and gbc__________。 public classExample{
String str=new String("good");
char[]ch={'a','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
Sytem.out.print(ex.ch);
}
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
}
34. 在android中,請簡述jni的調用過程。(8分)1)安裝和下載Cygwin,下載 Android NDK
2)在ndk項目中JNI介面的設計
3)使用C/C++實現本地方法
4)JNI生成動態鏈接庫.so文件
5)將動態鏈接庫復制到java工程,在java工程中調用,運行java工程即可
35. 簡述Android應用程序結構是哪些?(7分)Android應用程序結構是:
Linux Kernel(Linux內核)、Libraries(系統運行庫或者是c/c++核心庫)、Application
Framework(開發框架包)、Applications (核心應用程序)
36. 請繼承SQLiteOpenHelper實現:(10分) 1).創建一個版本為1的「diaryOpenHelper.db」的資料庫,
2).同時創建一個 「diary」 表(包含一個_id主鍵並自增長,topic字元型100
長度, content字元型1000長度)
3).在資料庫版本變化時請刪除diary表,並重新創建出diary表。
publicclass DBHelper extends SQLiteOpenHelper{
public final static String DATABASENAME ="diaryOpenHelper.db";
public final static int DATABASEVERSION =1;
//創建資料庫
public DBHelper(Context context,Stringname,CursorFactory factory,int version)
{
super(context, name, factory,version);
}
//創建表等機構性文件
public void onCreate(SQLiteDatabase db)
{
String sql ="create tablediary"+
"("+
"_idinteger primary key autoincrement,"+
"topicvar100),"+
"contentvar1000)"+
")";
db.execSQL(sql);
}
//若資料庫版本有更新,則調用此方法
public void onUpgrade(SQLiteDatabasedb,int oldVersion,int newVersion)
{
String sql = " ifexists diary";
db.execSQL(sql);
this.onCreate(db);
}
}
37. 頁面上現有ProgressBar控制項progressBar,請用書寫線程以10秒的的時間完成其進度顯示工作。(10分)答案
publicclass ProgressBarStu extends Activity {
private ProgressBar progressBar = null;
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progressbar);
//從這到下是關鍵
progressBar = (ProgressBar)findViewById(R.id.progressBar);
Thread thread = new Thread(newRunnable() {
@Override
public void run() {
int progressBarMax =progressBar.getMax();
try {
while(progressBarMax!=progressBar.getProgress())
{
intstepProgress = progressBarMax/10;
intcurrentprogress = progressBar.getProgress();
progressBar.setProgress(currentprogress+stepProgress);
Thread.sleep(1000);
}
} catch(InterruptedException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
});
thread.start();
//關鍵結束
}
}
38. 請描述下Activity的生命周期。 必調用的三個方法:onCreate() --> onStart() --> onResume(),用AAA表示
(1)父Activity啟動子Activity,子Actvity退出,父Activity調用順序如下
AAA --> onFreeze() --> onPause() --> onStop() --> onRestart()--> onStart(),onResume() …
(2)用戶點擊Home,Actvity調用順序如下
AAA --> onFreeze() --> onPause() --> onStop() -- Maybe -->onDestroy() – Maybe
(3)調用finish(), Activity調用順序如下
AAA --> onPause() --> onStop() --> onDestroy()
(4)在Activity上顯示dialog,Activity調用順序如下
AAA
(5)在父Activity上顯示透明的或非全屏的activity,Activity調用順序如下
AAA --> onFreeze() --> onPause()
(6)設備進入睡眠狀態,Activity調用順序如下
AAA --> onFreeze() --> onPause()
39. 如果後台的Activity由於某原因被系統回收了,如何在被系統回收之前保存當前狀態? onSaveInstanceState()
當你的程序中某一個Activity A在運行時,主動或被動地運行另一個新的Activity B,這個時候A會執行onSaveInstanceState()。B完成以後又會來找A,這個時候就有兩種情況:一是A被回收,二是A沒有被回收,被回收的A就要重新調用onCreate()方法,不同於直接啟動的是這回onCreate()里是帶上了參數savedInstanceState;而沒被收回的就直接執行onResume(),跳過onCreate()了。
40. 如何將一個Activity設置成窗口的樣式。 在AndroidManifest.xml 中定義Activity的地方一句話android:theme="@android:style/Theme.Dialog"或android:theme="@android:style/Theme.Translucent"就變成半透明的
41. 如何退出Activity?如何安全退出已調用多個Activity的Application?對於單一Activity的應用來說,退出很簡單,直接finish()即可。
當然,也可以用killProcess()和System.exit()這樣的方法。
但是,對於多Activity的應用來說,在打開多個Activity後,如果想在最後打開的Activity直接退出,上邊的方法都是沒有用的,因為上邊的方法都是結束一個Activity而已。
當然,網上也有人說可以。
就好像有人問,在應用里如何捕獲Home鍵,有人就會說用keyCode比較KEYCODE_HOME即可,而事實上如果不修改framework,根本不可能做到這一點一樣。
所以,最好還是自己親自試一下。
那麼,有沒有辦法直接退出整個應用呢?
在2.1之前,可以使用ActivityManager的restartPackage方法。
它可以直接結束整個應用。在使用時需要許可權android.permission.RESTART_PACKAGES。
注意不要被它的名字迷惑。
可是,在2.2,這個方法失效了。
在2.2添加了一個新的方法,killBackgroundProcesses(),需要許可權android.permission.KILL_BACKGROUND_PROCESSES。
可惜的是,它和2.2的restartPackage一樣,根本起不到應有的效果。
另外還有一個方法,就是系統自帶的應用程序管理里,強制結束程序的方法,forceStopPackage()。
它需要許可權android.permission.FORCE_STOP_PACKAGES。
並且需要添加android:sharedUserId="android.uid.system"屬性
同樣可惜的是,該方法是非公開的,他只能運行在系統進程,第三方程序無法調用。
因為需要在Android.mk中添加LOCAL_CERTIFICATE := platform。
而Android.mk是用於在Android源碼下編譯程序用的。
從以上可以看出,在2.2,沒有辦法直接結束一個應用,而只能用自己的辦法間接辦到。
現提供幾個方法,供參考:
1、拋異常強制退出:
該方法通過拋異常,使程序ForceClose。
驗證可以,但是,需要解決的問題是,如何使程序結束掉,而不彈出Force Close的窗口。
2、記錄打開的Activity:
每打開一個Activity,就記錄下來。在需要退出時,關閉每一個Activity即可。
3、發送特定廣播:
在需要結束應用時,發送一個特定的廣播,每個Activity收到廣播後,關閉即可。
4、遞歸退出
在打開新的Activity時使用startActivityForResult,然後自己加標志,在onActivityResult中處理,遞歸關閉。
除了第一個,都是想辦法把每一個Activity都結束掉,間接達到目的。
但是這樣做同樣不完美。
你會發現,如果自己的應用程序對每一個Activity都設置了nosensor,在兩個Activity結束的間隙,sensor可能有效了。
但至少,我們的目的達到了,而且沒有影響用戶使用。
為了編程方便,最好定義一個Activity基類,處理這些共通問題。
42. 請介紹下Android中常用的五種布局。FrameLayout(框架布局),LinearLayout (線性布局),AbsoluteLayout(絕對布局),RelativeLayout(相對布局),TableLayout(表格布局)