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 RAnd 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还是一脸懵逼的,网上查了一下才知道是什么意思,这里我先截个图,很直观:
其实就是走向下和右上对角线两条路线,我们多画几个图就可以看出来,这里举个例子:
0 6 12
1 5 7 11 13
2 4 8 10 14
3 9 15
其实规律很容易发现,首先循环是6(0,1,2,3,4,5)个一组,那么推广到nrows,就是2nrows-2,再可以看到,当当前row的在值大于0小于rows-1时,每行会重复出现两次,根据这个规律把数组填满就可以了。
public String convert(String s, int numRows) { int length=s.length(); char[] res=new char[length]; int mark=2*numRows-2; int temp=0; for(int i=0;i<numRows&&i<length;i++) { int index=mark-i; for(int j=i;j<length;j+=2*numRows-2) { res[temp++]=s.charAt(j); if(i>0&&i<numRows-1){ if(index<length) { res[temp++] = s.charAt(index); index += mark; } } } } return new String(res); }