我所了解的華為:
應屆本科生8k+
應屆碩士生10k+
應屆博士生12k+
看到后什么感想?有沒有只恨生不逢時運不佳的感覺?
很多人做3年多甚至更久,才能達到這個薪資水平,還不如一個新生。
在我看來,2013年應屆生應該在4k~5k,今年應屆生應該在5k~6k,如果達不到,自身找原因。對於一個慎重的人,應該慎重的選擇你們的衣食父母,選擇影響命運。
就扯這么多,好好選擇。
下面這道題是2010年華為員工晉級試題,列為三級,今年5月份左右一名華為的朋友拿來給我做(也是閑的無聊,想看看他們那邊都有什么玩意可以耍耍),相對來說,這道題難度不高,應屆生應該就有這個能力,不過審題一定要仔細了,不要因為當初審題不清,需求不明,后來做大量的修改。最忌諱的一點:不清不楚做開發,創造出來都是渣。
這道題大概用了一天時間,說實話,算法很簡單,時間用的太長了,也真夠渣渣了;
相關的地鐵線和站,請去官方網站使用正則匹配獲取,當初是這么干的,別手打,15線279站(不計算重復),累也累死了。
題中給了詳細思路
背景概述
城市的地鐵網絡由多條線路組成
每條線路上有多個車站,線路自身沒有交叉點
線路間交叉或重疊時,共用車站,在這些車站上可相互換乘
每條線路都是雙向行車 線路有兩種:
I形線和O形線 I形線有兩個端點,乘客在端點處只能乘坐開往另外一端的地鐵,在非端點處則有兩個方向可選擇。(如圖中8號線)
O形線所有車站形成環,沒有端點,乘客在任一站都有兩個方向可選擇。(如圖中4號線)
功能需求
在地鐵網絡中任選一站為起點,任選另一站為終點,中途可換乘,要求輸出
1)最短路線長度:從起點到終點經過的最少站數(站數計算不含起點,含終點)
2)最短路線:滿足最短路線長度要求的所有路線(可能有多條路線,每條路線從起點到終點順序輸出途經的所有站點,包括起點和終點)
完成功能1和功能2滿分100。
3)最優路線:換乘次數最少的最短路線(可能有多條路線)[本題20分,不計入總分]
輸入說明
地鐵網絡中的每一個站點用一個唯一的ID標識,ID是一個32位正整數;
一次輸入一條線路,線路表示為一個站點ID數組;
例如{2, 3, 6, 9, 10},表示這是一條I形線,2和10為兩端,數組元素順序和從一端到另一端途經站點的順序一致;
例如{1, 3, 6, 7, 4, 1},首尾站點一樣,表示這是一條O形線,數組元素順序和從站點1出發按某方向繞行一圈途經站點的順序一致;
兩條線路中出現了相同站點(如上面的3、6),表示兩條線路在這些站點可相互換乘。
示例
某城市的地鐵信息,如圖 Line1:{1,2,3,4,5}; Line2:{1,10,9,7,6}; Line3:{5,7,8}; Line4:{11,5}; 從起點站1到終點站11 1)最短路線長度是5 2)最短路線有2條,分別是{1, 2, 3, 4,5,11}和{1,10,9,7,5,11} 3)最優路線有1條:{1, 2, 3, 4,5,11} (換乘一次) |
![]() |
實現接口
說明:所有接口相互獨立,沒有調用順序的要求(所謂“調用順序”是例如:必須先調用2,再調用3,才能保證3的功能正確)
--------------------------------
(1) AddLine
Description
增加某條地鐵線路
Prototype
void AddLine(unsigned int LineNo, unsigned int StationNum ,unsigned int *pStationArray);
Input Param
LineNo 地鐵線路號;
StationNum 該條地鐵線中的站點數目,由調用者保證不小於2;
pStationArray 該條地鐵線的所有站點信息,pStationArray指向的存儲空間在函數外會被釋 放,請自行申請存儲空間;
Output Param
無
Return Value
無
--------------------------------
(2) CalcMinPathLen
Description
計算從起點站到終點站的最短路線長度
Prototype
int CalcMinPathLen(unsigned int SrcStation, unsigned int DesStation);
Input Param
SrcStation 起點站;
DesStation 終點站;
Output Param
無
Return Value
起點站到終點站的最短路線長度
-1:任何出錯情況(包括路線不存在、站點不存在、起點和終點重疊等等)
--------------------------------
(3) SearchMinPathes
Description
輸出從起點站到終點站的最短路線
Prototype
int SearchMinPathes(unsigned int SrcStation, unsigned int DesStation, unsigned int* pPathNum, unsigned int* pPathLen,unsigned int **ppPathes);
Input Param
SrcStation 起點站;
DesStation 終點站;
Output Param
pPathNum 最短路線條數;
pPathLen 最短路線長度;
ppPathes 存儲最短路線的內存地址,內存格式見下圖,內存空間在本函數內申請,調用者釋放;
Return Value
0:成功 -1:任何出錯情況(包括路線不存在、站點不存在、起點和終點重疊等等)
--------------------------------
(4) SearchBestPathes(附加題)
Description
輸出從起點站到終點站的最優路線
Prototype
int SearchBestPathes(unsigned int SrcStation,unsigned int DesStation,unsigned int *pPathNum, unsigned int* pPathLen,unsigned int** ppPathes);
Input Param
SrcStation 起點站;
DesStation 終點站;
Output Param
pPathNum 最優路線條數;
pPathLen 最短路線長度;
ppPathes 存儲最短路線的內存地址,內存格式見下圖,內存空間在本函數內申請,調用者釋放;
Return Value
0:成功 -1:任何出錯情況(包括路線不存在、站點不存在、起點和終點重疊等等)
--------------------------------
(5) Clear
Description 清空所有的線路信息
Prototype
void Clear();
Input Param
無
Output Param
無
Return Value
無
算法提示
說明:提示的並不是本題的唯一算法,考生可根據情況自行選擇是否采用。
1)最短路線長度算法提示
step1: 找到從起點出發,前進一站能到達的所有車站,記為SET1,若終點已包含在SET1中,則最短路線長度為1。
step2:對SET1中所有車站,找到前進一站能到達的所有車站,記為SET2,若終點已包含在SET2中,則最短路線長度為2。
...以此類推... stepn:
對SETn-1中所有車站,找到前進一站能到達的所有車站,記為SETn,若終點已包含在SETn中,則最短路線長度為n。
2)最短路線算法提示 最短路線長度算法在遍歷過程中未記錄路徑信息,需要增加用作記錄的數據結構設 計,該數據結構在最短路線長度的計算過程中生成。
3)最優路線算法提示 在求出最短路線的基礎上,對每一條路線計算換乘最小次數,從所有路線方案中 選擇最優解。
從此向下為后補內容,只提示算法的思想,不做算法:
以上圖為例,假設我們要從 2 —> 8
序號 | 站號 | 父節點(序號) |
0 | 2 (1) | -1 |
1 | 1 (2) | 0 |
2 | 3 (2) | 0 |
3 | 10(3) | 1 |
4 | 4(4) | 2 |
5 | 9(5) | 3 |
6 | 5(6) | 4 |
7 | 7(7) | 5 |
8 | 7(8) | 6 |
9 | 11(8) | 6 |
10 | 5(9) | 7 |
11 | 6(9) | 7 |
12 | 8(9) | 7 |
13 | 6(10) | 8 |
14 | 8(10) | 8 |
15 | 9(10) | 8 |
(1)將起始站2加入表。
(2)找出序號0的站2可達相鄰站1、3,此時1、3不在其父序{2}中,將1、3加入表,父節點設置為2的序號。
(3)找出序號1的站1可達相鄰站10、2,此時10不在其父序{2,1}中,將10加入表,父節點設置為1(序號);此時2在父序中,不做處理。
(4)找出序號2的站3可達相鄰站2、4,此時4不在其父序{2,3}中,將4加入表,父節點設置為2(序號);此時2在父序中,不做處理。
(5)找出序號3的站10可達相鄰站1、9,此時9不在其父序{2,1,10}中,將9加入表,父節點設置為3(序號);此時1在父序中,不做處理。
(6)找出序號4的站4可達相鄰站3、5,此時5不在其父序{2,3,4}中,將5加入表,父節點設置為4(序號);此時3在父序中,不做處理。
(7)找出序號5的站9可達相鄰站7、10,此時7不在其父序{2,1,10,9}中,將7加入表,父節點設置為5(序號);此時10在父序中,不做處理。
(8)找出序號6的站5可達相鄰站7、11,此時7、11不在其父序{2,3,4,5}中,將11、7加入表,父節點設置為6(序號)。
此時可能看出,7被添加到表中兩次,其實這兩次是不一樣的,仔細推敲吧。此表計算到最后是可以直接找出最優解和所有解,一種理想的數據結構和計算方法,直接拿滿分不是更好嗎?向下看。
(9)找出序號7的站7可達相鄰站5、6、8、9,此時5、6、8不在其父序{2,1,10,9,7}中,將5、6、8加入表,父節點設置為7(序號),此時9在父序中,不作處理。
此時已經出現到達站8了,但是還不能結束計算,必須要將循環計算到父節點小於站8父節點為7的位置才能結束,循環序號必須到達9(父節點為6,此上都小於7,此下都不小於7),為什么?
(10)找出序號8的站7可達相鄰站5、6、8、9,此時6、8、9不在其父序{2,3,4,5,7}中,將6、8、9加入表,父節點設置為8(序號),此時5在父序中,不作處理。
此時你應該看出來了,2-3-4-5-7-8 和 2-1-10-9-7-8 的間隔站是一樣的,如果在第(9)步就停止計算,就遺漏了一個解,此時還沒完,必須再走一次循環。
(11)找出序號9的站11可達相鄰站5,此時5在其父序{2,3,4,5,11}中,不作處理。
至此,循環已到達序號9,可以結束了。
現在要問:
最短線路有幾條,請數一數8在表中出現的次數,2;
最短線路是多長,請隨便找到一個8的位置,根據其父節點的值向上遍歷,到達頂部(父節點為-1的位置)的遍歷次數就是線路長度,比如我選序號14的8,根據其父節點向上遍歷:8-7-9-10-1-2 ,長度為5
我們可以從所有的8開始反向遍歷,看看誰的換線次數最少,(所有的線和站都有線性鏈表,計算遍歷線性鏈表的中斷次數),顯然 8-7-5-4-3-2 在遍歷時線性鏈表只中斷一次,也就是只換乘了一次。也就是我們要找的最優解,將其輸出即可2-3-4-5-7-8