您的位置:首页 > 编程语言 > C语言/C++

【ZigZag Conversion】cpp

2015-06-09 09:54 316 查看
题目:

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"


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

string convert(string text, int nRows);

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

代码:

class Solution {
public:
string convert(string s, int numRows) {
const int len = s.size();
if ( len<numRows || numRows==1 ) return s;
vector<char> ret;
const int INTERVAL = 2*numRows-2;
for ( int i=0; i<numRows; ++i )
{
int interval = 2*(numRows-i)-2;
for ( int j=i; j<len; interval=INTERVAL-interval)
{
ret.push_back(s[j]);
j = (interval==INTERVAL||interval==0) ? j+INTERVAL : j+interval;
}
}
return string(ret.begin(),ret.end());
}
};


tips:

找到ZigZag每行元素在元字符串s中间隔大小的规律。

=======================================

第二次过这道题,思路还是第一次的思路,但是代码不如第一次简洁了。

class Solution {
public:
string convert(string s, int numRows) {
vector<char> ret;
if ( numRows==1 ) return s;
const int interval = 2*(numRows-1);
for ( int i=0; i<numRows; ++i )
{
int j = i;
int preInterval = 2*i;
while ( j<s.size() )
{
ret.push_back(s[j]);
if ( preInterval!=0 && preInterval!=interval )
{
j = j + interval - preInterval;
preInterval = interval - preInterval;
}
else
{
j = j + interval;
}
}
}
return string(ret.begin(),ret.end());
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: