以最少的空间交换字符串前尾若干个元素

(a1,a2,……,am,x1,x2,……xp,b1,b2,……bn) ---> (b1,b2,……,bn,x1,x2,……,xp,a1,a2,……,am)

View Code
 1 #include <iostream>
2 using namespace std;
3
4 const int maxSize = 100;
5 int sz;//sz记录数组的长度
6 int m,n;
7 int* data;
8
9 void initialize()
10 {
11 data = new int[maxSize];
12 cout << "输入一组数据(以0结束):";
13 int tmp;
14 for(cin >> tmp; tmp != 0 && sz < maxSize; cin >> tmp){
15 data[sz] = tmp;
16 sz++;
17 }
18 cout << "输入m和n:";
19 cin >> m >> n;
20 }
21
22 void exchange_head_tail()
23 { //(a1,a2,…,am,…m1-mk…,b1,b2,…,bn)
24 if(m <= 0 || n <= 0)
25 return ;
26 //先把前m个元素逆序,得到(am,…,a2,a1,…m1-mk…,b1,b2,…,bn)
27 for(int i = 0; i < m/2; i++){
28 data[i] = data[i] + data[m-1-i];
29 data[m-1-i] = data[i] - data[m-1-i];
30 data[i] = data[i] - data[m-1-i];
31 }
32 //再把中间sz-m-n个元素逆序,得到(am,…,a2,a1,…mk-m1…,b1,b2,…,bn)
33 for(int i = m; i < (m+sz-n)/2; i++){
34 data[i] = data[i] + data[sz-n-1+m-i];
35 data[sz-n-1+m-i] = data[i] - data[sz-n-1+m-i];
36 data[i] = data[i] - data[sz-n-1+m-i];
37 }
38 //再把后n个元素逆序,得到(am,…,a2,a1,…mk-m1…,bn,…,b2,b1)
39 for(int i = sz-n; i < (sz-n+sz)/2; i++){
40 data[i] = data[i] + data[sz-1+sz-n-i];
41 data[sz-1+sz-n-i] = data[i] - data[sz-1+sz-n-i];
42 data[i] = data[i] - data[sz-1+sz-n-i];
43 }
44 //再把整个数组的元素逆序,得到结果(b1,b2,…,bn,…m1-mk…,a1,a2,…,am)
45 for(int i = 0; i < sz/2; i++){
46 data[i] = data[i] + data[sz-1-i];
47 data[sz-1-i] = data[i] - data[sz-1-i];
48 data[i] = data[i] - data[sz-1-i];
49 }
50 }
51
52 int main()
53 {
54 initialize();
55
56 cout << "将前m个数和后n个数交换。" << endl;
57 cout << "交换前:" << endl;
58 for(int i = 0; i < sz; i++)
59 cout << data[i] << " ";
60 cout << endl;
61
62 exchange_head_tail();
63
64 cout << "交换后:" << endl;
65 for(int i = 0; i < sz; i++)
66 cout << data[i] << " ";
67 cout << endl;
68 return 0;
69 }

  

  

  

posted @ 2011-10-13 00:45  crazykeyboard  阅读(346)  评论(0编辑  收藏  举报