ZigZag Conversion

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章