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