题目描述:
刚开始看到题目半天没看懂什么意思,后来查了查才理解题意,就是叫你把字符串按照图中从上到下从左到右(z字形)摆放,然后再按行读出来摆放后的字符串是什么。
解题思路:观察到Z字形排列的第一行为等差数列,考虑从第一行入手,第二行的坐标分别为第一行每个字符的坐标 -1 或者 +1,第三行的坐标分别为第一行每个字符的坐标 -2 或者 +2 。。。依次类推,通过此思路进行模拟。
代码如下:(不知道能不能看懂。。写的比较乱,这题改了很久)
class Solution {
public:
string convert(string s, int numRows) {// 模得神志不清系列
int n = s.size();
string t = "";
int dis = numRows*2 - 2; // 第一行每个字符和下个字符的坐标之差
int gap = 0; // 第n行字符和第一行字符坐标差,第一行为0,第二行为1,第三行为2。。。依次类推
int tar = 0; //工作坐标
if(numRows == 1) return s;
if(numRows > n) numRows = n; //处理错误输入
if(numRows == n) return s;
for(gap = 0 ;gap < numRows ;gap++){ // 外循环表示从第一行处理到最后一行
for(tar = 0;tar < n + dis;tar += dis){ //内循环:处理每行每个字符
if(gap == 0){ //第一行
if(tar < n && tar >= 0){
t += s[tar];
}
}
if(gap > 0 && gap < numRows - 1){ //第二行到倒数第二行
if( tar - gap >= 0 && tar - gap < n){// 边界判断
t += s[tar - gap]; // 处理左边元素
}
if( tar + gap < n && tar + gap >= 0){// 边界判断
t += s[tar + gap]; // 处理右边元素
}
}
if (gap == numRows - 1 ){// 最后一行
if(tar > 0){
if(tar - gap < n && tar - gap >= 0){
t += s[tar - gap]; //只处理左边
}
}
}
}
}
return t;
}
};