Leetcode0006--ZigZag Conversion

【轉載請註明】http://www.javashuo.com/article/p-doymrecn-bd.htmlhtml

 

來看一下題目:數組

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)this

P   A   H   N
A P L S I I G
Y   I   R

And then read line by line: "PAHNAPLSIIGYIR"spa

Write the code that will take a string and make this conversion given a number of rows:設計

string convert(string s, int numRows);

Example 1:3d

Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"

Example 2:code

Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:

P     I    N
A   L S  I G
Y A   H R
P     I

題目意思:htm

   給出字符串和行數blog

   設計出一種「豎-斜」式的顯示形式ip

   結果給出按橫行讀取的數值

下面的圖可能能更好的解釋圖示法:

 

總的來講:

一、顯示法

      利用代碼實現zigzag這樣的變形,再按讀取方向輸出

     

 

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows==1){return s;}
        int length = s.size(),count=0;
        char zigzag[numRows][length];       // 設定行、列矩陣
        fill(zigzag[0],zigzag[0]+numRows*length,'#');    // 初始化二維數組,首位置爲zigzag[0]
        enum{down,linear};                  //  設定方向
        int dir=down,x=0,y=0;
        while(count<s.size()){
            switch(dir){                // 判斷方向
                case down:
                    zigzag[x++][y]=s[count++];
                    //  當豎行越界後,已經到達末行+1,須要進行位置調整x-2,y+1
                    if(x>=numRows){dir=linear;x-=2;y++;}    
                    break;
                case linear:
                    zigzag[x--][y++]=s[count++];
                    //  當斜行越界後,到達首行-1,須要進行位置調整x+2,y-1
                    if(x<0){dir=down;x+=2;y--;}
                    break;
            }
        }
        string result;
        for(int i=0;i<numRows;i++){
            for(int j=0;j<length;j++){
                if(zigzag[i][j]!='#'){
                    result+=zigzag[i][j];
                }
            }
        }
        return result;
    }
};
相關文章
相關標籤/搜索