后期補充:網(wǎng)友對我詬病最多的就是我?guī)蛯W(xué)生做面試題,說這是小偷和騙子行為,在此,我對自己給學(xué)員做面試題做出如下解釋:
?(1)學(xué)員拿著面試題來找老師,學(xué)生也事先思考和嘗試后實在沒有辦法,又求職心切才想到找老師幫忙的。老師出于對題目和技術(shù)的好奇,也出于對學(xué)生的感情,才不辭勞苦去幫助做題的。明知小孩自己做不到,還不幫小孩去做,非要鍛煉孩子自己去做,現(xiàn)在估計很多父親都做不到吧。何況,學(xué)生也是我們的客戶,我們不去幫一下,這個顯得太冷酷無情了。
?(2)有人說,應(yīng)該讓學(xué)生自己去做,做不出來就別去招聘單位冒充好漢,幫學(xué)生做題就是鼓勵學(xué)生行騙和作惡!從這一點上來說,事情做得確實有點不光明磊落,但用行騙和作惡來形容,就言之過重了。畢竟用人單位也不是傻子,隨便找個農(nóng)民工把結(jié)果交上去,用人單位就會錄用嗎?用人單位在做題之前就對學(xué)員進行過一些基本的技術(shù)考核和交流,肯定也是覺得差不多了,才讓學(xué)生把題目拿回家去做的,學(xué)生做出來后,也要給他們?nèi)ブv解代碼思路的,只要學(xué)生能說清楚代碼思路,用人單位未必真關(guān)心是學(xué)員自己單獨做的,還是有朋友幫忙做的,因為很多單位的招聘崗位是對事不對人的,只要能把工作中安排的事情搞定,那就不管這個人是否是自己親自搞定的,還是靠外援搞定的,公司要的是事情的結(jié)果。很多公子哥在一些大公司都掛職“副總經(jīng)理”,難道這個公子哥真有“副總經(jīng)理”的能力嗎?不管他們有沒有,但是,他們能靠自己的關(guān)系把“副總經(jīng)理”要辦的事情辦妥,這就是公司的目的。同樣道理,公司不管學(xué)生是怎么做出來,只要學(xué)生做出來了,就說明他或他的親友團能解決公司日后分配給他的任務(wù),才不管他是怎么解決的呢?公司也許要的就是這一點。如果是這樣,我們正好滿足了公司的需求,怎么能說是行騙和作惡呢!
?(3)我歷來的一個觀念就是:對于我花時間研究透和解決過的技術(shù)問題,只有把這些知識分享出去,才能實現(xiàn)個人價值和社會價值的更大化。如果一個人花了很多時間和精力搞明白的知識只裝在自己的肚子里,不找機會把它應(yīng)用出來,那么這個知識就沒有什么價值,一個知識只有被很多人使用,被反復(fù)地使用,才能實現(xiàn)這個知識的價值最大化。所以,我把這些題目和解題思路都公布出來了,為了吸引更多人來學(xué)習(xí),我當(dāng)然要告訴大家這是面試題,并且是決定工作成敗的面試題,這也是提高大家來學(xué)習(xí)這個題目的熱情的一種激勵手法罷了,沒想到被送到了道德審判的十字架上了。
?
? 軟件開發(fā)公司現(xiàn)在都越來越精明和狡猾了,他們把日后工作中要解決的問題、并且是他們自己都很難解決的問題拿出來讓面試求職者去搞,做出來就可以來上班,這樣至少求職者在進公司之前就已經(jīng)熟悉未來的開發(fā)業(yè)務(wù)!
??前一陣子的某一天中午,有一個學(xué)員打電話給我說:“他去國內(nèi)某大型的軟件外包公司應(yīng)聘了,要求的薪水是7k,該公司給了他一道面試題,就是要做一個模擬的交通燈管理系統(tǒng),并說公司外包了一個法國交通系統(tǒng)的項目,現(xiàn)在就是在替做這個交通系統(tǒng)的項目組招人,這個交通燈管理系統(tǒng)就是招聘進來的人上班后要開發(fā)的項目模型,如果他在家三天內(nèi)能夠做出來,他就可以入職上班了,并且他要求的薪水則不是任何問題,還可以更高一些。”這個同學(xué)做了兩天,感到很困難,于是打電話向我求助,我讓他把題目發(fā)到我的郵箱。晚上,又有一個學(xué)員給我打電話,說是去某公司面試了,該公司讓他做一個交通燈管理系統(tǒng),三天內(nèi)做出來就可以直接去上班,我馬上告訴他,已經(jīng)有一個同學(xué)先他一步來找我了,我只能滿足他們兩人中的一人,否則,他們就會出現(xiàn)答案雷同,最后對他們兩人都造成不利影響。后來,又有幾個學(xué)員拿著不同公司的面試題找我,題目如出一轍,都是公司要求把日后的項目拿回家做,什么時候做好就什么時候上班。
??這些軟件公司精心策劃的項目題確實都有很強的技術(shù)性和實用價值,在此感謝奉獻了這些題目的學(xué)員,在征得這些學(xué)員們的同意后,我將逐步公布和講解這些項目面試題,下面是某公司的交通燈管理系統(tǒng)的需求。
交通燈管理系統(tǒng)
原始需求文檔下載????講座ppt下載????講座源碼下載????講座視頻下載
?
模擬實現(xiàn)十字路口的交通燈管理系統(tǒng)邏輯,具體需求如下:
·????????異步隨機生成按照各個路線行駛的車輛。
例如:
???????由南向而來去往北向的車輛----?直行車輛
???????由西向而來去往南向的車輛----?右轉(zhuǎn)車輛
???????由東向而來去往南向的車輛----?左轉(zhuǎn)車輛
???????。。。
·????????信號燈忽略黃燈,只考慮紅燈和綠燈。
·????????應(yīng)考慮左轉(zhuǎn)車輛控制信號燈,右轉(zhuǎn)車輛不受信號燈控制。
·????????具體信號燈控制邏輯與現(xiàn)實生活中普通交通燈控制邏輯相同,不考慮特殊情況下的控制邏輯。
注:南北向車輛與東西向車輛交替放行,同方向等待車輛應(yīng)先放行直行車輛而后放行左轉(zhuǎn)車輛。
·????????每輛車通過路口時間為1秒(提示:可通過線程Sleep的方式模擬)。
·????????隨機生成車輛時間間隔以及紅綠燈交換時間間隔自定,可以設(shè)置。
·????????不要求實現(xiàn)GUI,只考慮系統(tǒng)邏輯實現(xiàn),可通過Log方式展現(xiàn)程序運行結(jié)果。
解題思路
·????????首先,為了較好地理解和分析問題,切不可空想,一定要畫圖!畫圖非常有助于理解和分析問題,你還有比畫圖更好的辦法嗎?
我畫的交通燈路線圖如下:
·????????接著進行面向?qū)ο蟮姆治龊驮O(shè)計:
(一)每條路線上都會出現(xiàn)多輛車,路線上要隨機增加新的車,在燈綠期間還要每秒鐘減少一輛車。
? 1.設(shè)計一個Road類來表示路線,每個Road對象代表一條路線,總共有12條路線,即系統(tǒng)中總共要產(chǎn)生12個Road實例對象。
? 2.每條路線上隨機增加新的車輛,增加到一個集合中保存。
? 3.每條路線每隔一秒都會檢查控制本路線的燈是否為綠,是則將本路線保存車的集合中的第一輛車移除,即表示車穿過了路口。
(二)每條路線每隔一秒都會檢查控制本路線的燈是否為綠,一個燈由綠變紅時,應(yīng)該將下一個方向的燈變綠。
? 1.設(shè)計一個Lamp類來表示一個交通燈,每個交通燈都維護一個狀態(tài):亮(綠)或不亮(紅),每個交通燈要有變亮和變黑的方法,并且能返回自己的亮黑狀態(tài)。
? 2.總共有12條路線,所以,系統(tǒng)中總共要產(chǎn)生12個交通燈。右拐彎的路線本來不受燈的控制,但是為了讓程序采用統(tǒng)一的處理方式,故假設(shè)出有四個右拐彎的燈,只是這些燈為常亮狀態(tài),即永遠不變黑。
? 3.除了右拐彎方向的其他8條路線的燈,它們是兩兩成對的,可以歸為4組,所以,在編程處理時,只要從這4組中各取出一個燈,對這4個燈依次輪詢變亮,與這4個燈方向?qū)?yīng)的燈則隨之一同變化,因此Lamp類中要有一個變量來記住自己相反方向的燈,在一個Lamp對象的變亮和變黑方法中,將對應(yīng)方向的燈也變亮和變黑。每個燈變黑時,都伴隨者下一個燈的變亮,Lamp類中還用一個變量來記住自己的下一個燈。
? 4.無論在程序的什么地方去獲得某個方向的燈時,每次獲得的都是同一個實例對象,所以Lamp類改用枚舉來做顯然具有很大的方便性,永遠都只有代表12個方向的燈的實例對象。
? 5.設(shè)計一個LampController類,它定時讓當(dāng)前的綠燈變紅。
·????????類的編碼實現(xiàn)
(一)Road類
? 1.每個Road對象都有一個name成員變量來代表方向,有一個vehicles成員變量來代表方向上的車輛集合。
? 2.在Road對象的構(gòu)造方法中啟動一個線程每隔一個隨機的時間向vehicles集合中增加一輛車(用一個“路線名_id”形式的字符串進行表示)。
? 3.在Road對象的構(gòu)造方法中啟動一個定時器,每隔一秒檢查該方向上的燈是否為綠,是則打印車輛集合和將集合中的第一輛車移除掉。
源碼如下:
?
[java]?view plaincopy
package?com.isoftstone.interview.traffic;?????????import?java.util.ArrayList;????import?java.util.List;????import?java.util.Random;????import?java.util.concurrent.ExecutorService;????import?java.util.concurrent.Executors;????import?java.util.concurrent.ScheduledExecutorService;????import?java.util.concurrent.TimeUnit;?????????/**???*?每個Road對象代表一條路線,總共有12條路線,即系統(tǒng)中總共要產(chǎn)生12個Road實例對象。???*?每條路線上隨機增加新的車輛,增加到一個集合中保存。???*?每條路線每隔一秒都會檢查控制本路線的燈是否為綠,是則將本路線保存車的集合中的第一輛車移除,即表示車穿過了路口。???*?@author?張孝祥?www.it315.org???*???*/????public?class?Road?{????????????private?List?vechicles?=?new?ArrayList();????????????????????????private?String?name?=null;????????????public?Road(String?name){???????????????????this.name?=?name;??????????????????????????????????????//模擬車輛不斷隨機上路的過程?????????????????????????????ExecutorService?pool?=?Executors.newSingleThreadExecutor();???????????????????pool.execute(new?Runnable(){???????????????????????????public?void?run(){???????????????????????????????????for(int?i=1;i<1000;i++){??????????????????????????????????????????try?{??????????????????????????????????????????????????Thread.sleep((new?Random().nextInt(10)?+?1)?*?1000);??????????????????????????????????????????}?catch?(InterruptedException?e)?{??????????????????????????????????????????????????e.printStackTrace();??????????????????????????????????????????}??????????????????????????????????????????vechicles.add(Road.this.name?+?"_"?+?i);???????????????????????????????????}?????????????????????????????????????????????????????????}??????????????????????????????????????????????});??????????????????????????????????????//每隔一秒檢查對應(yīng)的燈是否為綠,是則放行一輛車??????????????????????????????????ScheduledExecutorService?timer?=??Executors.newScheduledThreadPool(1);???????????????????timer.scheduleAtFixedRate(???????????????????????????????????new?Runnable(){??????????????????????????????????????????public?void?run(){??????????????????????????????????????????????????if(vechicles.size()>0){?????????????????????????????????????????????????????????boolean?lighted?=?Lamp.valueOf(Road.this.name).isLighted();?????????????????????????????????????????????????????????if(lighted){?????????????????????????????????????????????????????????????????System.out.println(vechicles.remove(0)?+?"?is?traversing?!");?????????????????????????????????????????????????????????}??????????????????????????????????????????????????}????????????????????????????????????????????????????????????????????????????????????????????}???????????????????????????????????},???????????????????????????????????1,???????????????????????????????????1,???????????????????????????????????TimeUnit.SECONDS);???????????????????????????????}????}??
??
?
(二)Lamp類
? 1.系統(tǒng)中有12個方向上的燈,在程序的其他地方要根據(jù)燈的名稱就可以獲得對應(yīng)的燈的實例對象,綜合這些因素,將Lamp類用java5中的枚舉形式定義更為簡單。
? 2.每個Lamp對象中的亮黑狀態(tài)用lighted變量表示,選用S2N、S2W、E2W、E2N這四個方向上的Lamp對象依次輪詢變亮,Lamp對象中還要有一個oppositeLampName變量來表示它們相反方向的燈,再用一個nextLampName變量來表示此燈變亮后的下一個變亮的燈。這三個變量用構(gòu)造方法的形式進行賦值,因為枚舉元素必須在定義之后引用,所以無法再構(gòu)造方法中彼此相互引用,所以,相反方向和下一個方向的燈用字符串形式表示。?
? 3.增加讓Lamp變亮和變黑的方法:light和blackOut,對于S2N、S2W、E2W、E2N這四個方向上的Lamp對象,這兩個方法內(nèi)部要讓相反方向的燈隨之變亮和變黑,blackOut方法還要讓下一個燈變亮。
? 4.除了S2N、S2W、E2W、E2N這四個方向上的Lamp對象之外,其他方向上的Lamp對象的nextLampName和oppositeLampName屬性設(shè)置為null即可,并且S2N、S2W、E2W、E2N這四個方向上的Lamp對象的nextLampName和oppositeLampName屬性必須設(shè)置為null,以便防止light和blackOut進入死循環(huán)。
源碼如下:
?
?
[java]?view plaincopy
package?com.isoftstone.interview.traffic;?????????/**???*?每個Lamp元素代表一個方向上的燈,總共有12個方向,所有總共有12個Lamp元素。???*?有如下一些方向上的燈,每兩個形成一組,一組燈同時變綠或變紅,所以,???*?程序代碼只需要控制每組燈中的一個燈即可:???*?s2n,n2s???????*?s2w,n2e???*?e2w,w2e???*?e2s,w2n???*?s2e,n2w???*?e2n,w2s???*?上面最后兩行的燈是虛擬的,由于從南向東和從西向北、以及它們的對應(yīng)方向不受紅綠燈的控制,???*?所以,可以假想它們總是綠燈。???*?@author?張孝祥?www.it315.org???*???*/????/**/?????????public?enum?Lamp?{????????????/*每個枚舉元素各表示一個方向的控制燈*/????????????????????S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),????????????/*下面元素表示與上面的元素的相反方向的燈,它們的“相反方向燈”和“下一個燈”應(yīng)忽略不計!*/????????????N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),????????????/*由南向東和由西向北等右拐彎的燈不受紅綠燈的控制,所以,可以假想它們總是綠燈*/????????????S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);????????????????????????private?Lamp(String?opposite,String?next,boolean?lighted){???????????????????this.opposite?=?opposite;???????????????????this.next?=?next;???????????????????this.lighted?=?lighted;????????????}??????????????????????/*當(dāng)前燈是否為綠*/?????????????????private?boolean?lighted;????????????/*與當(dāng)前燈同時為綠的對應(yīng)方向*/?????????????private?String?opposite;????????????/*當(dāng)前燈變紅時下一個變綠的燈*/?????????????private?String?next;????????????public?boolean?isLighted(){???????????????????return?lighted;????????????}????????????????????????/**???????????*?某個燈變綠時,它對應(yīng)方向的燈也要變綠???????????*/?????????????????public?void?light(){???????????????????this.lighted?=?true;???????????????????if(opposite?!=?null){???????????????????????????Lamp.valueOf(opposite).light();???????????????????}???????????????????System.out.println(name()?+?"?lamp?is?green,下面總共應(yīng)該有6個方向能看到汽車穿過!");???????????????????????????????}????????????????????????/**???????????*?某個燈變紅時,對應(yīng)方向的燈也要變紅,并且下一個方向的燈要變綠???????????*?@return?下一個要變綠的燈???????????*/?????????????????public?Lamp?blackOut(){???????????????????this.lighted?=?false;???????????????????if(opposite?!=?null){???????????????????????????Lamp.valueOf(opposite).blackOut();???????????????????}????????????????????????????????????????????????????Lamp?nextLamp=?null;???????????????????if(next?!=?null){???????????????????????????nextLamp?=?Lamp.valueOf(next);???????????????????????????System.out.println("綠燈從"?+?name()?+?"-------->切換為"?+?next);?????????????????????????????????????????nextLamp.light();???????????????????}???????????????????return?nextLamp;????????????}????}??
?
(三)LampController類
? 1.整個系統(tǒng)中只能有一套交通燈控制系統(tǒng),所以,LampController類最好是設(shè)計成單例。
? 2.LampController構(gòu)造方法中要設(shè)定第一個為綠的燈。?
? 3.LampController對象的start方法中將當(dāng)前燈變綠,然后啟動一個定時器,每隔10秒將當(dāng)前燈變紅和將下一個燈變綠。
源碼如下:
?
[java]?view plaincopy
package?com.isoftstone.interview.traffic;?????????import?java.util.concurrent.Executors;????import?java.util.concurrent.ScheduledExecutorService;????import?java.util.concurrent.TimeUnit;?????????public?class?LampController?{????????????private?Lamp?currentLamp;????????????????????????public?LampController(){???????????????????//剛開始讓由南向北的燈變綠;??????????????????????????????currentLamp?=?Lamp.S2N;???????????????????currentLamp.light();??????????????????????????????????????/*每隔10秒將當(dāng)前綠燈變?yōu)榧t燈,并讓下一個方向的燈變綠*/?????????????????????????????????ScheduledExecutorService?timer?=??Executors.newScheduledThreadPool(1);???????????????????timer.scheduleAtFixedRate(???????????????????????????????????new?Runnable(){??????????????????????????????????????????public??void?run(){??????????????????????????????????????????????????System.out.println("來啊");??????????????????????????????????????????????????currentLamp?=?currentLamp.blackOut();???????????????????????????????????}???????????????????????????????????},???????????????????????????????????10,???????????????????????????????????10,???????????????????????????????????TimeUnit.SECONDS);????????????}????}??
??
?
(四)MainClass類
? 1.用for循環(huán)創(chuàng)建出代表12條路線的對象。
? 2.接著創(chuàng)建出LampController對象。?
源碼如下:
?
[java]?view plaincopy
package?com.isoftstone.interview.traffic;?????????public?class?MainClass?{?????????????????/**???????????*?@param?args???????????*/????????????public?static?void?main(String[]?args)?{??????????????????????????????????????/*產(chǎn)生12個方向的路線*/??????????????????????????????????String?[]?directions?=?new?String[]{???????????????????????????????????"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"????????????????????????????????};???????????????????for(int?i=0;i<directions.length;i++){???????????????????????????new?Road(directions[i]);???????????????????}??????????????????????????????????????/*產(chǎn)生整個交通燈系統(tǒng)*/????????????????????????????new?LampController();????????????}?????????}??
總結(jié)
以上是生活随笔為你收集整理的联想利泰的一道做出来就给月薪7K的面试题--交通灯管理系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。