标签:
斜角线循环: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
标签:
原文地址:http://blog.csdn.net/yinqiaohua/article/details/43635325