1.题意
输入:字符串,行数
输出:N字形镜像旋转后的字符串
2.思路
第一反应:一列列排,中间每一列只有一个字符,找空格规律
参考方案:找同一行字符串间的间隔规律,
首尾字符间差值为(2n-2)
中间行字符差值为X =(2n-2)-2i,(2n-2)-X, (2*n-2)-X…
最后将字符串数组串起来组装成新的字符串
3.反思
思维还是太局限,应该关注输出是什么,着眼于输出于输入的关系,从其中找突破口,而不应拘泥于原字符串的顺序。
class Solution {
public:
string convert(string s, int numRows) {
int i = 0, n = numRows;
string* p = new string[n];
if (s.length() == 1 || n ==1 || n >=s.length() )
{
return s;
}
for(; i < n; i++)
{
if(i == 0|| i ==n-1)
{
p[i].append(s,i,1);
int x = i+2*n-2;
for (;x < s.length(); x = x+2*n-2)
{
p[i].append(s,x,1);
}
}
else
{
int x= 2*n-2-2*i;
p[i].append(s,i,1);
int y = i;
for(;y+x < s.length(); x =(2*n-2)-x )
{
y = y+x;
p[i].append(s,y,1);
}
}
}
string outString;
for(int z =0; z < n; z++)
{
outString.append(p[z]);
}
delete [] p;
return outString;
}
};
4.进步
因为逻辑分支较多,画了程序流程图
5.库的相关轮子
string类型的变量s[x]按数组形式取出来的字符不能直接作为append函数的参数,故在字符串后面插入另一个字符串的截取片段为方法应为,dest.append(src,x,1)
x为起始字符串序号,1这里表示取一个字符。
另,看了下在字符串中使用push_back的方法可以直接插入另一个字符串数组取出的字符,std库有相应的函数重载,试验了一下也可行。但性能没有append好。
ref:relative_link