黑马程序员_7k面试题之交通灯
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ------- android培訓(xùn)、java培訓(xùn)、java學(xué)習(xí)型技術(shù)博客、期待與您交流! ----------
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 7k面試題之交通燈
1 ? ?題目要求
模擬實現(xiàn)十字路口的交通燈管理系統(tǒng)邏輯,具體有以下需求
1).?異步隨機生成按照各個路線行駛的車輛
舉例說明如下:
[1].?由南向北行駛的車輛?----直行車輛
[2].?由西向南行駛的車輛?----右轉(zhuǎn)車輛
[3].?由東向南行駛的車輛?----左轉(zhuǎn)車輛
…
2).?信號燈顏色選擇范圍
忽略黃燈,只考慮紅燈和綠燈
3).?左轉(zhuǎn)車輛和右轉(zhuǎn)車輛的要求
[1].?左轉(zhuǎn)車輛受到控制信號燈的控制
[2].?但是右轉(zhuǎn)車輛不受信號燈控制
【注意】具體信號燈控制邏輯與現(xiàn)實生活中普通交通燈控制邏輯相同,不考慮特殊情況下的控制邏輯。
4).?其他說明
[1].?南北向車輛與東西向車輛交替放行,同方向等待車輛應(yīng)先放行直行車輛而后放行左轉(zhuǎn)車輛。
[2].?每輛車通過路口時間為1秒(提示:可通過線程Sleep的方式模擬)。
[3].?隨機生成車輛時間間隔以及紅綠燈交換時間間隔自定,可以設(shè)置。
[4].?不要求實現(xiàn)GUI,只考慮系統(tǒng)邏輯實現(xiàn),可通過Log方式展現(xiàn)程序運行結(jié)果。
2 ? ?題意分析
路口分析以及簡化
(1).?十字路口線路圖
(2).?圖例和相關(guān)術(shù)語
[1].?方向簡寫
N?--->北?S?--->南??E--->東??W?--->西
[2].?“2”是英文單詞“to”的意思
e.g.?N2S表示從北到南的線路
[3].?對應(yīng)線路
{1}.?一條線路和他的對應(yīng)線路可以同時放行的時候,不會出現(xiàn)兩條線路上的車輛的相互撞車的事件。
{2}.?這里面將一條線路的對應(yīng)線路在后面用“()”括起來。
{3}.?圖中顏色相同的線路表示“一對”對應(yīng)線路
[4].?圖中線路的分類
這個十字路口中一共有12條線路存在,分成以下三類:
{1}.?右轉(zhuǎn)線路?(4條)
圖中四個拐角的褐色線路。分別是:N2W、W2S、S2E和E2N
{2}.?左轉(zhuǎn)線路?(4條)
圖中兩條粉色和兩條紅色的線路。分別是:N2E(S2W)和W2N(S2E)
{3}.?直行線路?(4條)
圖中兩條綠色和兩條藍色的線路。分別是:?N2S(S2N)和E2W(W2E)
[6].?線路的要求
{1}.?直行+左轉(zhuǎn)的8條線路必須遵守這條線路上的交通燈的指示進行運行和停止
{2}.?右轉(zhuǎn)的4條線路不用按照紅綠燈自由運行。
(2).?線路分析簡化設(shè)計思路
[1].?簡化原則
{1}.?這里總共有12條路線,因此每條路線作為一個對象存在。
{2}.?為了統(tǒng)一編程模型,可以假設(shè)每條路線都有一個紅綠燈對該條線路的車進行控制。
{3}.?其中右轉(zhuǎn)彎的4條路線的控制燈可以設(shè)為常綠狀態(tài)。
{4}.其他8條線路是兩兩成對的,可以歸為4組。
所以程序只需考慮圖中標(biāo)注了數(shù)字的4條路線的控制燈的切換順序,這4條路線對應(yīng)方向的路線的控制燈跟隨標(biāo)記數(shù)字的4條路線切換,不必額外考慮。
[2].?根據(jù)題目需求進行線路切換次序確定
{1}.?需求是“南北向車輛與東西向車輛交替放行,同方向等待車輛應(yīng)先放行直行車輛而后放行左轉(zhuǎn)車輛。”
{2}.?線路簡化之后,只考慮了兩個方向出發(fā)的車:
{2}1.?從S方向出發(fā)的車:S2W和S2N這兩個方向的線路?----?要求是先放行直行再放行左轉(zhuǎn),所以這里面是S2N先放行,S2W后放行
{2}2.?從E方向出發(fā)的車:E2W和E2S這兩個方向的線路?----?要求是先放行直行再放行左轉(zhuǎn),所以這里面是E2W先放行,E2S后放行
{2}3.?從S方向或者E方向那個開始都可以,因為這些線路的交通燈是循環(huán)切換的。因此這里面從S方向開始。
所以線路切換是
S2N【1】--->?S2W【2】--->?E2W【3】?--->?E2S?【4】--->S2N【1】?--->...循環(huán)
算上每條線路的對應(yīng)線路,下面給出完整的線路切換是:
S2N(N2S)【1】--->?S2W(N2E)【2】--->?E2W(W2E)【3】?--->?E2S(W2N)【4】--->S2N(N2S)【1】?--->...循環(huán)
[3].?簡化之后的線路圖如下
這里面需要真實考慮的線路只有直行的2條+?左轉(zhuǎn)的2條?(一共4條線路)
3.????面向?qū)ο蟮姆治龀醪?/span>
1).?通過需求分析名詞,定義出類
(1).?類的提取
[1].?需求中出現(xiàn)的類:交通燈、線路、車輛
[2].?額外的類?(通過分析需求)
需求是車在線路上運行,運行的時候要觀察該條線路上的交通燈的顏色的變化。這個交通燈的顏色怎么切換?靠誰去切換?肯定不是交通燈自己切換,而是交通燈靠一個交通燈控制器去切換。------第四個類是:交通燈控制器
【總結(jié)】所需的類:交通燈、線路、車輛和交通燈控制器四個類
(2).?面向?qū)ο蟮姆治雠c設(shè)計的原則
[1].?面向?qū)ο笤O(shè)計把握一個重要的經(jīng)驗
分析的出來的哪個類有哪些數(shù)據(jù),這個類就對外提供操作這些數(shù)據(jù)的方法。
【注意】數(shù)據(jù)就是指的是這個類的成員變量
[2].?從一個比較復(fù)雜的類,也就是字面上看著會有很多成員的類進行分析。因為這樣的類可以直接分析出來很多成員,有利于接下來對其他的類進行分析
[3].?為每一個類進行兩件事情的分析
{1}.?分析這個類的成員變量
一定要分析需求,根據(jù)這個需求自行描繪出來這個事件發(fā)生的過程,在這個過程中分析出這個類可能的“聚合”或者“包含”的其他類的成員變量即可。
{2}.分析這個類的成員方法
根據(jù)分析出來的成員變量和包含需求事件發(fā)生的過程為這個類的對象添加需要對外訪問的方法。
【注意1】成員變量和成員方法絕對不是一下子就添加完成的,邊分析邊做項目,邊添加。
【注意2】就是每一個提取出來的類不一定必須要自定義一個單獨的類。如果Java的核心類庫有合適的類型匹配,那就可以直接選來使用。
3? ?交通燈類Lamp的程序編寫
1) 編寫過程中注意事項
(1). Lamp類應(yīng)該采用枚舉更好
所有地方的交通燈都是一樣的,具有12個代表12條線路的交通燈,不會多也不會少,因此這種固定不變的類Lamp類采用JDK5的枚舉來做顯然具有很大的方便性
(2). 一對一的映射關(guān)系可以使用String類型來替代Lamp成員屬性
由于Lamp類中的表示對應(yīng)線路的屬性和下一條切換線路的屬性都是一對一的關(guān)系,因此一一對一的關(guān)系可以采用String類型來簡化替代Lamp類聚合的表示對應(yīng)的Lamp類的實例和表示下一條交通燈的Lamp類實例。
2). Lamp類代碼示例
(1).Lamp的點亮和滅掉交通燈的方法
增加讓Lamp變亮和變黑的方法:light和blackOut,對于S2N、S2W、E2W、E2N這四個方向上的Lamp對象,這兩個方法內(nèi)部要讓相反方向的燈隨之變亮和變黑,blackOut方法還要讓下一個燈變亮。
(2). Lamp類示例代碼
package cn.isoftstone.interview.traffic;/*** 每個Lamp元素代表一個方向上的燈,總共有12個方向,所有總共有12個Lamp枚舉元素。 * 程序代碼只需要控制每組燈中的一個燈即可:----括號中的表示該線路的交通燈對應(yīng)的線路的交通燈* S2N(N2S)、S2W(N2E)、 E2W(W2E)、 E2S(W2N) -----受紅綠燈控制的交通燈* S2E(N2W) 和E2N(W2S) -----不受紅綠燈控制的交通燈* @author XinmingZhang*/ public enum Lamp {//每個枚舉元素各表示一個線路方向上的控制燈//左轉(zhuǎn)的兩條主路+ 兩條直行線 ----初始化這些主路的燈光是滅的---RedS2N("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),//四條右拐的路 常綠 ---四個右轉(zhuǎn)彎方向的燈,因為其不受紅綠燈控制,所以可以假設(shè)它們總是綠燈N2W(null, null, true), W2S(null, null, true), S2E(null, null, true), E2N(null, null, true);//當(dāng)前燈的狀態(tài),是否為綠private boolean lighted =false; //當(dāng)前線路交通燈的對應(yīng)線路的交通燈private String opposite =null; //一對一 所以使用String的name替代//當(dāng)前線路交通燈的被切換到下一個交通燈private String next =null; //一對一 所以使用String的name替代/*** 構(gòu)造函數(shù)* @param opposite ----當(dāng)前線路對應(yīng)線路的交通燈的名字* @param next --------當(dāng)前線路的下一條線路的交通燈的名字* @param lighted -----這條線路的交通燈初始化的時候被點亮(代表綠燈)*/private Lamp(String opposite, String next, boolean lighted){this.lighted =lighted;this.opposite =opposite;this.next =next;}/*** lighted屬性的Getter* @return---獲取當(dāng)前線路的交通燈的狀態(tài)*/public boolean isLighted() {return lighted;}/*** 點亮該燈----點亮表示將燈變成綠色的* 某個燈變綠時,它對應(yīng)方向的燈也要變綠*/public void light(){this.lighted =true;//同時要點亮對應(yīng)路段的交通燈if(this.opposite !=null){LampoppositeLamp =Lamp.valueOf(opposite);oppositeLamp.light();}System.out.println(name()+" lamp is green, 下面可以看到6個方向看到汽車穿過!");}/*** 滅掉該燈----也就是將該路段的交通燈變紅* @return----返回下一站切換的路燈*/public Lamp blackOut(){//當(dāng)前燈變紅,對應(yīng)方向的燈也變紅this.lighted =false;//同時要滅掉對應(yīng)路段的燈if(this.opposite !=null){LampoppositeLamp =Lamp.valueOf(opposite);oppositeLamp.blackOut();}//點亮下一對應(yīng)的燈LampnextLamp =null;if(next !=null){nextLamp=Lamp.valueOf(next);nextLamp.light();System.out.println("綠燈從"+ name()+"--->切換為"+next);}return nextLamp;} }
3) ? 線路類Road程序編寫
?1?編寫過程中注意事項(1). 刪除方法 ------代表車輛穿過這條線路
每條路線每隔一秒都會檢查控制本路線的燈是否為綠,是則將本路線保存車的集合中的第一輛車移除,即表示車穿過了路口。
(2). 增加車輛和刪除車輛的方法簡化
這兩個方法僅僅被使用一次之后即可,不需要被其他的方法調(diào)用。因此簡化程序,就直接放入到Road類的構(gòu)造方法即可。
(3). Road類構(gòu)造方法設(shè)計思路
2 先設(shè)計成單線程的構(gòu)造方法
先生成車(初始化成員對象)? ----> 在放行這些車寫成單線程程序如下:
public Road(Stringname){this.name =name;//隨機的時間間隔生成1000輛車for(int i=0; i<1000; i++){try {int randomTime =(newRandom().nextInt(10)+ 1)*1000;Thread.sleep(randomTime);this.vehichles.add(this.name+"_"+ i);} catch(InterruptedException e) {// TODOAuto-generated catch blocke.printStackTrace();}}//每隔一秒放行一輛車while(vehichles.size()>0){//1s放行一輛車try {Thread.sleep(1000);} catch(InterruptedException e) {e.printStackTrace();}//觀察是否可以通過這條路 ---- 觀察這條路上的對應(yīng)的交通燈對應(yīng)的狀態(tài)boolean lighted =Lamp.valueOf(this.name).isLighted();if(lighted){System.out.println(vehichles.remove(0)+" istraversing!");}} }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?------- android培訓(xùn)、 java培訓(xùn)、 java學(xué)習(xí)型技術(shù)博客、期待與您交流! ----------
總結(jié)
以上是生活随笔為你收集整理的黑马程序员_7k面试题之交通灯的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【软件测试人生】程序员最大的谎言是什么?
- 下一篇: linux集群课程,超全Linux集群技