? 問題是這樣的,有一串?dāng)?shù)字,需要進(jìn)行一系列的解碼亿笤,解密規(guī)則是:首先將第1個數(shù)刪除,緊接著第2個數(shù)放到這串?dāng)?shù)的末尾栋猖,再將第3個數(shù)刪除并將第4個數(shù)放到這串?dāng)?shù)的末尾净薛,再將第5個數(shù)刪除……,直到剩下最后一個數(shù)蒲拉,將最后一個數(shù)也刪除肃拜。按照刪除的順序,把這些刪除的數(shù)連再一起全陨,就是得到的密碼。 我們使用 631758924 作為樣例衷掷,得到的結(jié)果應(yīng)該是 615947283 辱姨。
? 我們先來分析一下思路,這串?dāng)?shù)字就是一個隊(duì)列戚嗅,再排隊(duì)雨涛,從頭到尾,從前面開始懦胞,每次拿掉最前面的兩個替久,第1個扔掉,第2個放到尾部躏尉。然后再考慮排在第3個和第4個的數(shù)蚯根,這滿足 先進(jìn)先出 的原理,所以是隊(duì)列胀糜。
? 具體過程是這樣的:剛開始這串?dāng)?shù)是“6 3 1 7 5 8 9 2 4”颅拦,首先刪除6并將3放到這串?dāng)?shù)的末尾蒂誉,這串?dāng)?shù)跟新為“1 7 5 8 9 2 4 3”,依次這樣操作后距帅,最后剩下一個3右锨,在將3放在末尾后,刪除碌秸。
? 這里我們使用了一個數(shù)組來保存著一串?dāng)?shù)字绍移。解密的第一步是將第一個數(shù)刪除,最簡單的方法是將所有后面的數(shù)都往前面挪動一位讥电,將前面的數(shù)覆蓋蹂窖。就好比我們排隊(duì)買票,最前面的人買好離開了允趟,后面所有的人就需要往全部向前面走一步恼策,補(bǔ)上之前的空位,但是這樣的做法很耗費(fèi)時間潮剪。
在這里涣楷,我們引入兩個整型變量 head 和 tail 。head用來記錄隊(duì)列的隊(duì)首(即第一位)抗碰,tail用來記錄隊(duì)列的隊(duì)尾(即最后一位)的下一個位置(這樣可以避免head和tail重復(fù)帶來的麻煩狮斗,并規(guī)定隊(duì)首和隊(duì)尾重合時,隊(duì)列為空)弧蝇。
現(xiàn)在就上操作流程圖和實(shí)例代碼碳褒。
這里使用了高效率的System數(shù)組拷貝方法看疗,使的在原密碼的最后一個數(shù)字后面還有多的空間給前面的數(shù)字排隊(duì)沙峻。
刪除一個數(shù)時,可以使用另一個數(shù)組來保存两芳,這里直接使用了打印在控制臺上來輸出顯示摔寨。我們使用循環(huán)來打印密碼的每一個數(shù)字,直到當(dāng)head與tail相等時怖辆,代表隊(duì)列為空是复,跳出循環(huán)。
現(xiàn)在我們來總結(jié)一下隊(duì)列的概念竖螃,隊(duì)列使一種特殊的線性結(jié)構(gòu)淑廊,它只允許在隊(duì)列的首部(head)進(jìn)行刪除操作,這稱為“出隊(duì)”特咆,而在隊(duì)列的尾部(tail)進(jìn)行插入操作季惩,這稱為“入隊(duì)”。當(dāng)隊(duì)列中沒有元素時(即head == tail),稱為空隊(duì)列蜀备。隊(duì)列就像上面提到的排隊(duì)買票一樣关摇,在整個隊(duì)列中,新來的人總是站在隊(duì)列的最后面碾阁,來得越早的人越靠前输虱,也能越早買到票,就是先來的人先服務(wù)脂凶,我們稱為“先進(jìn)先出”(First In First Out宪睹,F(xiàn)IFO)原則。隊(duì)列將時我們以后要學(xué)習(xí)的廣搜(BFS)以及 Bellman-Ford最短路徑 算法的核心數(shù)據(jù)結(jié)構(gòu)蚕钦。
? 所以亭病,我們現(xiàn)在可以將隊(duì)列的三個基本元素(一個數(shù)組,兩個變量)封裝為一個類嘶居。如下罪帖。
到這里,我們使用一個封裝好了的簡單隊(duì)列來實(shí)現(xiàn)這個問題邮屁。這里才用內(nèi)部類的方式封裝整袁,方便主函數(shù)調(diào)用。