string-6.ZigZag Conversion

来源:互联网 发布:js实现下拉菜单 编辑:程序博客网 时间:2024/05/29 03:55

题目描述:

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P   A   H   N
A P L S I I G
Y   I   R
And then read line by line: "PAHNAPLSIIGYIR"
string convert(string text, int nRows);

Write the code that will take a string and make this conversion given a number of rows:

convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".


 题目解析:

1. 此题的意思是:输入一个字符串str和该字符串行数row,该str其实是按照‘之’字形来读取的,现在需要改为按照行来读取。

2. 思路就是:找规律。以上述例子中的str为例,字符串占3行,“payp”可以看做第一组,“alis”看做第二组。其实就是每组第一行和最后一行各有一个字符,中间行数有两个字符,从而可以算出每组的字符个数是: memNum=2+2*(row-2)。

       (1.)设置index = 0,第一行的字符依次是:str[index*memNum+0],index++,直到index*memNum>=size结束。

       (2.)注意第一行的计算方法是:index*memNum+0 ,最后一行的计算方法是:index*memNum+row-1。第二行到第n-1行每组有两个,第index组的计算方法是:index*memNum + i (ib表示当前行数) 和 index*menNum + i + 2*(row-i-1)。


代码如下:

// 时间复杂度是O(n)。空间复杂度是O(1)。

class Solution {public:    string convert(string s, int numRows)     {if(numRows < 2 || s.empty())            return s;                // 利用规律来写出字符串        int size = s.size();int nMembNum = 2+2*(numRows-2);string strOut;for(int i=0; i<numRows; ++i){int index = 0, mult = 0;if(i==0 || i== numRows-1){while(index < size){index = mult*nMembNum + i;if(index < size)strOut.append(1, s[index]);++mult;}}else{while(index < size){index = mult*nMembNum + i;if(index < size)strOut.append(1, s[index]);index = mult*nMembNum + i + 2*(numRows-i-1);if(index < size)strOut.append(1, s[index]);++mult;}}}return strOut;     }};




原创粉丝点击