这题好久以前就尝试去做过,今天拿到依然没思路。想了几分钟又有思路了,直接把每个字母在哪一层用数组保存起来就好了,接着就用了双重循环枚举得到结果,时间复杂度是O(N*numRows),空间复杂度是O(n);又想了一想,既然每个元素的层次已经确定了,为什么不一遍填到结果字符串里面去呢,然后就又开了一个数组,存储每一层所有元素的个数,在用一个循环使得每一层的值保存到前面所有元素的和,这样就能把每个字符直接填到自己的位置上了。下面是代码:
string convert(string s, int num) {
if(num==1) return s;
int n=s.size();
vector<int> res(n,0);
vector<int> lev(num+1,0);
int p=1,f=0;
for(int i=0;i<n;i++){
res[i] = p;
lev[p]++;//lev[p]保存p行的元素个数
if(!f) p++;
if(f) p--;
if(p==1) f=0;
if(p==num) f=1;
}
//还需把lev【p】的含义变为p层之前的元素个数总和
int sum=0;
for(int i=0;i<=num;i++){
sum+=lev[i];
lev[i] = sum;
}
string ans(s);
for(int i=0;i<n;i++){
ans[lev[res[i]-1]++] = s[i];
}
return ans;
}