【轉載請註明】http://www.javashuo.com/article/p-doymrecn-bd.htmlhtml
來看一下題目:數組
The string P A H N
A P L S I I G
Y I R
And then read line by line: 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; } };