-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path006_ZigZagConversion.c
97 lines (86 loc) · 1.93 KB
/
006_ZigZagConversion.c
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//%57.62
char* convert(char* s, int numRows) {
//First check the boundaries
if(!s || 1 >= numRows)
return s;
int lengthS = strlen(s);
if(lengthS <= numRows)
return s;
char *rst = (char *)malloc(lengthS + 1);
//Start the calculating here
int srcIndex = 0;
int rstIndex = 0;
bool flag = true;
int deltaIndexDown = (numRows - 1) << 1;
int deltaIndexUp;
//For row '0' specifically
while(srcIndex < lengthS)
{
rst[rstIndex++] = s[srcIndex];
srcIndex += deltaIndexDown;
}
for(int row = 1; row < numRows - 1; row++)
{
srcIndex = row;
flag = true;
deltaIndexDown = (numRows - row - 1) << 1;
deltaIndexUp = row << 1;
while(srcIndex < lengthS)
{
rst[rstIndex++] = s[srcIndex];
if(flag)
srcIndex += deltaIndexDown;
else
srcIndex += deltaIndexUp;
flag = !flag;
}
}
//For row 'numRows - 1' specificily
deltaIndexUp = (numRows - 1) << 1;
srcIndex = numRows - 1;
while(srcIndex < lengthS)
{
rst[rstIndex++] = s[srcIndex];
srcIndex += deltaIndexUp;
}
rst[rstIndex] = '\0';
return rst;
}
//57.62% faster
char* convert001(char* s, int numRows) {
//First check the boundaries
if(!s || 1 >= numRows)
return s;
int lengthS = strlen(s);
if(lengthS <= numRows)
return s;
char *rst = (char *)malloc(lengthS + 1);
//Start the calculating here
int srcIndex = 0;
int rstIndex = 0;
bool flag = true;
for(int row = 0; row < numRows; row++)
{
srcIndex = row;
if(row != numRows - 1)
flag = true;
else
flag = false;
int deltaIndexDown = (numRows - row - 1) << 1;
int deltaIndexUp = row << 1;
while(srcIndex < lengthS)
{
rst[rstIndex++] = s[srcIndex];
if(flag)
srcIndex += deltaIndexDown;
else
srcIndex += deltaIndexUp;
if(!row || row == numRows - 1)
continue;
else
flag = !flag;
}
}
rst[rstIndex] = '\0';
return rst;
}