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 s, int numRows);
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
Example 2:
Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
P I N
A L S I G
Y A H R
P I
这道题真的很简单有没有,规律一找到直接5分钟就写完了- - 找规律20分钟吧。
n = numRows
假设有 0 ~ (numRow-1)这么多行, 其实就是一个下标找规律,等差数列,不过分一分奇偶的情况
第 i 行,如果 i = 0 || i = (nRow - 1), 那么就是 a1 = i, d = 2 * (numRow -1)
其他行: a1 = i; a(n) = a(n-1) + d;
d = 2 * ( numRow - 1 - i) ,如果 n 为奇数
d = 2 * i ,如果 n 为偶数
AC 代码:( 0 和 numRows - 1的情况可以合起来,懒得改)
string convert(string s, int numRows) {
if(numRows == 1)
return s;
int len; int k = 0;
len = (int)s.length() - 1;
string temp(s); //一样的长度的temp,这个算深拷贝吧- - 因为我怕有些编译器浅拷贝什么的
for(int i = 0; i < numRows; i++){
if( i == 0){
int index = 0;
while(index <= len){
temp[k++] = s[index];
index = index + 2*(numRows - 1);
}
continue;
}
if( i == numRows - 1){
int index = numRows - 1;
while(index <= len){
temp[k++] = s[index];
index = index + 2*(numRows - 1);
}
continue;
}else{
int index = i, flag = 0;
while(index <= len){
temp[k++] = s[index];
if(flag == 0){
index = index + 2*(numRows - 1 - i);
flag = 1;
}else{
flag = 0;
index = index + 2 * i;
}
}
}
}
return temp;
}