题目: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)
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".
意思就是大概就是
给一个字符串和行数,倒Z排列好了以后,最后返回的字符串是所有的行拼接起来的。abcdefghijklmn,numRows=5,输出字符为aibhjcgkdflnem
思路:一开始就想好了把上下和中间分隔开来,这样就简单一点,上和下的代码都一样,只是循环的起点不一样,距离都是numRows+numRows-2,中间有点麻烦,刚开始想错了,以为它每一丨都是从上到下依次的来,写完提交以后才发现是z字形的,然后只要重写中间的代码就行,仔细看了一下中间的数字规律就是:第一个字母不用说是i,第二个是(numRows-i)2,第三个是i2-1,然后又是(numRows-i)*2,一直循环,想了想只能靠一个boolean来控制这样的转换用来控制取字母的循环变量。附上我的代码:
public String convert(String s, int numRows) {
if(s=="")return "";
if(numRows<2)return s;
String result="";
boolean bian=true;
for(int i=0;i<s.length();i+=numRows+numRows-2) {
result+=s.charAt(i);
}
for(int i=1;i<numRows-1;i++) {
for(int j=i;j<s.length();j++) {
result+=s.charAt(j);
if(bian) {j+=(numRows-i-1)*2-1;bian=false;continue;}
if(!bian) {j+=i*2-1;bian=true;}
}
bian=true;
}
for(int i=numRows-1;i<s.length();i+=numRows+numRows-2) {
result+=s.charAt(i);
}
return result;
}
测试了一下别人的代码和我的代码,别人用了1ms,我用了18。。。。。
好好研究学习一下,这一篇文章就这样
public String convert(String s, int nRows) {
char[] c = s.toCharArray();
int len = c.length;
StringBuffer[] sb = new StringBuffer[nRows];
for (int i = 0; i < sb.length; i++) sb[i] = new StringBuffer();
int i = 0;
while (i < len) {
for (int idx = 0; idx < nRows && i < len; idx++) // vertically down
sb[idx].append(c[i++]);
for (int idx = nRows-2; idx >= 1 && i < len; idx--) // obliquely up
sb[idx].append(c[i++]);
}
for (int idx = 1; idx < sb.length; idx++)
sb[0].append(sb[idx]);
return sb[0].toString();
}