6. 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"

詞義分析:首先一定得弄清楚zigzag是“之字形”的意思歧蕉,“之字形”是“鋸齒形”的意思灾部,可以腦補一下鋸齒形的畫面,實在想不出可以看下圖惯退,因為這個詞一定得弄清楚不然會影響你的理解赌髓,甚至會直接引導你到錯誤的方向。

大致意思:給定連續(xù)幾行的字符串以鋸齒形的形式排列顯示催跪,編寫代碼實現將按照鋸齒形順序排列的字符轉換成按照一行接一行的字符順序顯示锁蠕,就是將示例中的

鋸齒形順序的”PAYPALISHIRING“轉換成行讀順序的”PAHNAPLSIIGYIR“。

常規(guī)解法:以一個正常的思路來思考這個問題懊蒸,大多數人都會采用一個比較通俗易懂的方法來解決荣倾,就是將鋸齒形順序排列的字符依次存入一個二維數組中,然后按照正常遍歷的順序也就是題目中的一行接一行的順序遍歷顯示出來即可骑丸。

class Solution {
public:
    string convert(string s, int numRows) {
        char tb[1000][1000]={NULL};
        int len=s.length();
        if(numRows==1)
            return "";
        if(numRows==1)
            return s;
        int z=ceil((double)(len+numRows-2)/(2*(numRows-1)));
        int col=0;
        int flag=0;
        for(int i=0;i<z && flag<=len;++i)
        {
            int row=0;
            while(row<numRows && flag<=len)
            {
                tb[row++][col]=s[flag++];
            }
            --row;
            for(int ct=0;ct<numRows-2 && flag<=len;++ct)
            {
                tb[--row][++col]=s[flag++];
            }
            ++col;
        }
        string ot;
        int lie=z+(numRows-2)*(z-1);
        for(int i=0;i<numRows;++i)
        {
            for(int j=0;j<lie;++j)
            {
                if(tb[i][j]!=NULL)
                ot.append(1,tb[i][j]);
            }
        }
        return ot;
    }
};

代碼解釋:首先開辟了一個很大的二維數組舌仍,因為題目沒要求字符串的長度限制,所以一般不會特別大通危。思路是:先算出以鋸齒形排列的主干列數(完整的列)铸豁,也就是最高的行列數,從二維數組的左上角開始:1.從上到下依次填滿字符菊碟;2.然后再沿對角線的方向依次填滿字符节芥;不斷重復這兩個操作直到將字符串中的字符按照鋸齒形填完為止。整個過程要注意行標和列標的變化逆害。最后遍歷輸出即可头镊。

其他解法:兩個完整的列增炭,如示例中的“PAY”和“ALI”之間會有1個字符,也就是(numRows-2)個字符拧晕,這樣整個字符串就劃分成了很多個numRows+numRows-2個字符串隙姿,當然尾部不一定滿足,這樣第一行和最后一行就可以以此為間隔依次取原字符串中字符生成厂捞,中間的行需要加上鋸齒形中間的字符输玷。到這里大家會發(fā)現其實就是下標計算的問題,注意不要越界就行靡馁。

class Solution {
public:
   string convert(string s, int numRows) {
       if(numRows <= 0) return "";
       if(numRows == 1) return s;
       string rst = "";
       int sz = s.size();
       for(int i=0; i<numRows; ++i) {
           int idx = i;
           while(idx < sz) {
               rst += s[idx];
               if(i!=0 && i!=numRows-1) {
                   idx += (numRows-1-i)*2;
                   if(idx >= sz) break;
                   else rst += s[idx];
                   idx += i*2;
               }
               else idx += (2*numRows-2);
           }
       }
       return rst;
   }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末欲鹏,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子臭墨,更是在濱河造成了極大的恐慌赔嚎,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胧弛,死亡現場離奇詭異尤误,居然都是意外死亡,警方通過查閱死者的電腦和手機结缚,發(fā)現死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門损晤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人红竭,你說我怎么就攤上這事尤勋。” “怎么了茵宪?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵最冰,是天一觀的道長。 經常有香客問我稀火,道長暖哨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任憾股,我火速辦了婚禮鹿蜀,結果婚禮上,老公的妹妹穿的比我還像新娘服球。我一直安慰自己茴恰,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布斩熊。 她就那樣靜靜地躺著往枣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上分冈,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天圾另,我揣著相機與錄音,去河邊找鬼雕沉。 笑死集乔,一個胖子當著我的面吹牛,可吹牛的內容都是我干的坡椒。 我是一名探鬼主播扰路,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼倔叼!你這毒婦竟也來了汗唱?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丈攒,失蹤者是張志新(化名)和其女友劉穎哩罪,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體巡验,經...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡际插,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了深碱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腹鹉。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖敷硅,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情愉阎,我是刑警寧澤绞蹦,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站榜旦,受9級特大地震影響幽七,放射性物質發(fā)生泄漏。R本人自食惡果不足惜溅呢,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一澡屡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咐旧,春花似錦驶鹉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春姚淆,著一層夾襖步出監(jiān)牢的瞬間孕蝉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人经伙。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓互妓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親俗慈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容