-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathzigZagConversion.cpp
More file actions
49 lines (49 loc) · 1.38 KB
/
zigZagConversion.cpp
File metadata and controls
49 lines (49 loc) · 1.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
* 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) {
if(numRows == 1)
return s;
const int len = s.size();
int parts = len/(2*numRows-2);
if(len % (2*numRows-2) != 0)
parts++;
const int part_max_len = 2*numRows - 2;
string res=s;
int cnt = 0;
for(int i=0; i<numRows; i++){
//calc 'i'th numRows
int step = 2*(numRows-i)-2;
if(step == 0)
step = 2*(numRows-i)-2;
for(int j=0; j<parts; j++){
int index = i+j*part_max_len;
if(index<len){
res[cnt] = s[index];
cnt++;
}
if(step==0 || step==part_max_len)
continue;
index += step;
if(index<len){
res[cnt] = s[index];
cnt++;
}
}
}
return res;
}
};