薪資至少10K的一道題,你能拿下嗎


我所了解的華為:

  應屆本科生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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM