OK,現在輪到你動手的時候了。快去找出9張便籤或小紙片,將“6 3 1 75 8 9 2 4”這9個數分別寫在9張便籤上,模擬一下解密過程。如果你沒有理解錯解密規則的話,解密後小哈的QQ號應該是“6 1 5 94 7 2 8 3”。
其實解密的過程就像是將這些數“排隊”。每次從最前面拿兩個,第1個扔掉,第2個放到尾部。具體過程是這樣的:剛開始這串數是“6 3 1 75 8 9 2 4”,首先刪除6並將3放到這串數的末尾,這串數更新爲“1 7 5 89 2 4 3”。接下來刪除1並將7放到末尾,即更新爲“5 8 9 24 3 7”。再刪除5並將8放到末尾即“9 2 4 3 7 8”,刪除9並將2放到末尾即“4 3 7 8 2”,刪除4並將3放到末尾即“7 8 2 3”,刪除7並將8放到末尾即“2 3 8”,刪除2並將3放到末尾即“8 3”,刪除8並將3放到末尾即“3”,最後刪除3。因此被刪除的順序是“6 1 5 9 4 7 2 8 3”,這就是小哈的QQ號碼了,你可以加她試試看^_^。
既然現在已經搞清楚瞭解密法則,不妨自己嘗試一下去編程,我相信你一定可以寫出來的。
首先需要一個數組來存儲這一串數即intq[101]。並初始化這個數組即intq[101]={0,6,3,1,7,5,8,9,2,4};(此處初始化是我多寫了一個0,用來填充q[0],因爲我比較喜歡從q[1]開始用,對數組初始化不是很理解的同學可以去看下我的上一本書《啊哈C!思考快你一步》)接下來就是模擬解密的過程了。
解密的第一步是將第一個數刪除,你可以想一下如何在數組中刪除一個數呢?最簡單的方法是將所有後面的數都往前面挪動一位,將前面的數覆蓋。就好比我們在排隊買票,最前面的人買好離開了,後面所有的人就需要全部向前面走一步,補上之前的空位,但是這樣的做法很耗費時間。
現在有9個數,9個數全部放入隊列之後head=1;tail=10;此時head和tail之間的數就是目前隊列中“有效”的數。如果要刪除一個數的話,就將head++就OK了,這樣仍然可以保持head和tail之間的數爲目前隊列中“有效”的數。這樣做雖然浪費了一個空間,卻節省了大量的時間,這是非常划算的。新增加一個數也很簡單,把需要增加的數放到隊尾即q[tail]之後再tail++就歐克啦。
我們來小結一下,在隊首刪除一個數的操作是head++;
#include <stdio.h> int main() { int q[102]={0,6,3,1,7,5,8,9,2,4},head,tail; int i; //初始化隊列 head=1; tail=10; //隊列中已經有9個元素了,tail執向的隊尾的後一個位置 while(head<tail) //當隊列不爲空的時候執行循環 { //打印隊首並將隊首出隊 printf("%d ",q[head]); head++; //先將新隊首的數添加到隊尾 q[tail]=q[head]; tail++; //再將隊首出隊 head++; } getchar();getchar(); return 0; }
struct queue { int data[100];//隊列的主體,用來存儲內容 int head;//隊首 int tail;//隊尾 };
struct queue q;
q.head=1; q.tail=1; scanf("%d",&q.data[q.tail]);
#include <stdio.h> struct queue { int data[100];//隊列的主體,用來存儲內容 int head;//隊首 int tail;//隊尾 }; int main() { struct queue q; int i; //初始化隊列 q.head=1; q.tail=1; for(i=1;i<=9;i++) { //依次向隊列插入9個數 scanf("%d",&q.data[q.tail]); q.tail++; } while(q.head<q.tail) //當隊列不爲空的時候執行循環 { //打印隊首並將隊首出隊 printf("%d ",q.data[q.head]); q.head++; //先將新隊首的數添加到隊尾 q.data[q.tail]=q.data[q.head]; q.tail++; //再將隊首出隊 q.head++; } getchar();getchar(); return 0; }
上面的這種寫法看起來雖然冗餘了一些,但是可以加強你對隊列這個算法的理解。C++的STL庫已經有隊列的實現,有興趣的同學可以參看相關材料。隊列的起源已經無法追溯。在還沒有數字計算機之前,數學應用中就已經有對隊列的記載了。我們生活中隊列的例子也比比皆是,比如排隊買票,又或者吃飯時候用來排隊等候的叫號機,又或者撥打銀行客服選擇人工服務時,每次都會被提示“客服人員正忙,請耐心等待”,因爲客服人員太少了,撥打電話的客戶需要按照打進的時間順序進行等候等等。這裏表揚一下肯德基的宅急送,沒有做廣告的嫌疑啊,每次一打就通,基本不需要等待。但是我每次打銀行的客服(具體是哪家銀行就不點名了)基本都要等待很長時間,總是告訴我“正在轉接,請稍後”,嘟嘟嘟三聲後就變成“客服正忙,請耐心等待!”然後就給我放很難聽的曲子。看來錢在誰那裏誰就是老大啊……
碼字不容易啊,轉載麻煩註明出處
【一週一算法】解密QQ號——隊列
http://bbs.ahalei.com/thread-4489-1-1.html
(出處: 啊哈磊_編程從這裏起步)