6.Z字形变换
我的解法:
首先定义了3个变量:index、add和step。
- index:当前处理字符在原字符串中的下标;
- add:Z字形中相邻两个字符在原字符串中的下标之差(非固定值,值随着行的改变会发生变化,这里是除了Z字形的第一行和最后一行);
- step:Z字形中第一行和最后一行相邻两字符在原字符串中的下标之差(固定值2*numRows-2)
之后使用for循环,每轮确定最终Z字形的一行数据,因此共有numRows次循环。
每轮循环中元素下标index从i开始,再使用while循环确定当前Z字形这一行所对应的字符,通过add和step确定Z字形这一行当前元素的下一元素在原字符串中的下标(第一行和最后一行,下一元素的下标增加了step,其余行,下一元素下标多了add)
N字形示意图,其中x代表numRows
class Solution {
public:
string convert(string s, int numRows) {
if(numRows == 1){
return s;
}
string res;
int n = s.length();
int index,add,step = 2 * numRows - 2;
for(int i = 0; i < numRows; ++i){
index = i;
add = 2 * i;
while(index < n){
res += s[index];
add = step - add;
index += (i == 0 || i == numRows - 1) ? step : add;
}
}
return res;
}
};