leetcode 6st ZigZag Conversion

1.题意
输入:字符串,行数
输出:N字形镜像旋转后的字符串

2.思路
第一反应:一列列排,中间每一列只有一个字符,找空格规律
参考方案:找同一行字符串间的间隔规律,
首尾字符间差值为(2n-2)
中间行字符差值为X =(2
n-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

你可能感兴趣的:(leetcode,Practice)