-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpp_2.6.3.cpp
More file actions
72 lines (65 loc) · 1.59 KB
/
pp_2.6.3.cpp
File metadata and controls
72 lines (65 loc) · 1.59 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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
using namespace std;
void rotate_string(string &s, int k) {
int len = s.length();
k %= len;
int count = 0;
for (int i=0; i<k; i++) {
char tmp = s[i];
int cur = i, next = (cur+k)%len;
do {
s.replace(cur, 1, 1, s[next]);
count ++;
cur = next;
next = (next+k) % len;
} while (next != i);
s.replace(cur, 1, 1, tmp);
count ++;
if (count >= len) break;
}
}
void reverse_string(string &s, int start, int end) {
while (start < end) {
char c = s[start];
s.replace(start, 1, 1, s[end]);
s.replace(end, 1, 1, c);
start++;
end--;
}
}
void rotate_string1(string &s, int k) {
int len = s.length();
k %= len;
reverse_string(s, 0, k-1);
reverse_string(s, k, len-1);
reverse_string(s, 0, len-1);
}
void rotate_sub_string(string &s, int start, int mid, int end) {
if (end - start <= 1) return;
int left = mid - start + 1, right = end - mid;
if (left <= right) {
for (int i=start; i<start+left; i++) {
char c = s[i];
s.replace(i, 1, 1, s[end-left+1+(i-start)]);
s.replace(end-left+1+(i-start), 1, 1, c);
}
rotate_sub_string(s, start, start+right, end-left);
} else if (left > right) {
for (int i=mid; i < mid+right; i++) {
char c = s[i];
s.replace(i, 1, 1, s[start+(i-mid)]);
s.replace(start+(i-mid), 1, 1, c);
}
rotate_sub_string(s, mid, mid+right, end);
}
}
void rotate_string2(string &s, int k) {
int len = s.length();
k %= len;
rotate_sub_string(s, 0, k, len-1);
}
int main (int argc, char *argv[]) {
string s("0123456789");
rotate_string2(s, 4);
cout << s;
}