真的是一直不敢写的题目,就是空着一直都没有写,因为之前看答案觉得模拟起来很麻烦。可能是那时候我的代码能力还不太足以支持我写出细颗粒的语言吧。
废话不多说,就是一个字符串的模拟。结合别的答案,自己也把写了一遍。稍微去进行一下。
题目思路分析,以及代码编写:
比如这一行图:其实就是划分成N真的一种序列,然后行读取的方式去进行读取。但是需要去找一点点的小规律。
我们很容易发现,在同一列中,首元素和末尾元素索引的差值是n-1.
那么同一行中,两个字母间隔是2*n-2。
那么我们可以首先得出结论①。首末两行我们直接可以去进行输出。因为每一个元素之间的间隔是2*n-2.
现在再去处理除了首末两行的元素。
其实也不难发现:其实同一个竖线的差值起始也是2*n-2
.但是中间的这些行,还需要去处理竖线的元素,竖线其实也是遵循等差数列的规律。
那么此时的问题有转化了,也就是最后一个步骤,如果得到非竖线的元素的索引位置,其实又很简单。我们还是以第二行为例子。
如何求出O的缩影位置呢?是不是在字符串中D的前一个元素呢?但是D的输出结果中的上一个元素是i。而D的元素输出结果是2n-2.那么O的索引结果为:2n-2-i.
那么现在整理好了,代码如下:
class Solution {
public:
string convert(string s, int n) {
//注意条件的特判
if(n==1) return s;
string res;
for(int i=0;i<n;i++){
if(i==0||i==n-1){
for(int j=i;j<s.size();j+=2*n-2) res+=s[j];
}
else{
for(int j=i,k=2*n-2-i;j<s.size()||k<s.size();j+=2*n-2,k+=2*n-2){
if(j<s.size()) res+=s[j];
if(k<s.size()) res+=s[k];
}
}
}
return res;
}
};