The string "PAYPALISHIRING"
is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N
A P L S I I G
Y I R
And then read line by line: "PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3)
should return "PAHNAPLSIIGYIR"
.
問題很清晰了,只是官網的示例排版不太好,在紙上畫下abcdedfg排版下就可以了。
這個問題似乎沒有什麼算法可以套用,比如動態規劃、遞歸之類,只能是在紙上多用幾個實例寫幾遍,找出規律:
直接上代碼:
有幾點自己想要提醒下:
1,每寫一個函數,都要想想這個函數實現什麼功能? 是怎麼樣實現的? 這裏想到一個看代碼的好思路:先搞明白這個函數是幹嘛的,問題的定義是什麼。如果叫你來實現,你會怎麼實現? 然後再來看別人的函數具體實現過程,暗中和自己的代碼比較下優缺點。而平時看代碼,我是反的來的,先看函數的實現過程,然後再知道這個函數幹嘛的。
2,要實現一個功能,先想清楚思路,着重考慮如果處在邊界情況會發生什麼? 比如我在首次寫上面的函數時,第八行是這樣的: if(numRows>=n) ,這有個大問題,如果numRows==1,那麼程序會陷入死循環!
3,單元測試的必要性,第2點的死循環檢測,就是利用下面的單元測試發現的。
#define FUNC zigPrint
void check(string s,int numRows,string expt)
{
string rlt = FUNC(s,numRows);
if(rlt==expt)
cout<<"check: "<<s<<" ,pass."<<endl;
else
cout<<"check: "<<s<<" ,faild. expt: "<<expt<<" rlt: "<<rlt<<endl;
}
int main()
{
check("abc",1,"abc"); //單元測試的必要性:一整就整出死循環了!
check("abc",2,"acb");
check("abc",0,"abc");
check("abc",-1,"abc");
check("abcdefghijk",100,"abcdefghijk");
check("abcdefghijk",1,"abcdefghijk");
check("abcdefghijk",2,"acegikbdfhj");
check("abcdefghijk",3,"aeibdfhjcgk");
check("abcdefghijk",4,"agbfhceikdj");
check("abcdefghijk",5,"aibhjcgkdfe");
check("abcdefghijk",6,"akbjcidhegf");
check("abcdefghijk",7,"abckdjeifhg");
check("abcdefghijk",8,"abcdekfjgih");
return 0;
}