ZigZag Conversion
(图片来自http://www.cnblogs.com/sanghai/p/3632528.html)
向下循环:nRows
斜角线循环:nRows-2(减去首尾两个端点)
定义一列和一斜对角线的循环长度为dLen=nRows+nRows-2;
1 第一行和最后一行,均是由第一列加上dLen的倍数,即可
2 其余行,每计算出下一列的下标j之后,再判断j+dLen-2*i是否还在s的长度范围内。其中,i代表所在的行,j为s中的下标。(如第二行,第一列j=1,第二行的第二个元素为下标7=1+dLen-2*1)。
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
string convert(string s, int nRows) {
if(nRows==1)
return s;
int dLen=nRows+nRows-2;
int len=s.size();
string result;
for(int i=0;i<nRows;++i)
{
int j=i;
if(j==0||j==nRows-1)//将第一行和最后一行单独提出来
{
while(j<len)
{
result+=s[j];
j=j+dLen;
}
}
else//其余行
{
while(j<len)
{
result+=s[j];
if(j+dLen-2*i<len)//每一行的第偶数个元素下标
{
result+=s[j+dLen-2*i];
}
j=j+dLen;
}
}
}
return result;
}
};
int main()
{
string s;
int n;
cin>>s>>n;
Solution S;
cout<<S.convert(s,n);
return 0;
}
网上的代码:
string convert(string s, int nRows){
if(nRows == 1) return s;
string res[nRows];
int i = 0, j, gap = nRows-2;
while(i < s.size()){
for(j = 0; i < s.size() && j < nRows; ++j) res[j] += s[i++];
for(j = gap; i < s.size() && j > 0; --j) res[j] += s[i++];
}
string str = "";
for(i = 0; i < nRows; ++i)
str += res[i];
return str;
}
http://www.cnblogs.com/sanghai/p/3632528.html