posts - 183,  comments - 10,  trackbacks - 0
函数实现将网址进行如下操作
www.google.com 转成 com.google.www 及 mail.netease.com 转成 com.netease.mail
不允许用STL,空间为 O(1)

http://topic.csdn.net/u/20110425/12/8b5e155c-73d1-40af-84b8-6b6493f638e2.html

一开始把 O(1) 看做时间复杂度了,如果是空间复杂度,直接在原地两次翻转即可。整体翻转,部分翻转顺序可以任意。
 1 #include <iostream>
 2 using namespace std;
 3 
 4 void reverse_(char* s, int left, int right)
 5 {
 6     while (left < right)
 7     {
 8         s[left]  ^= s[right];
 9         s[right] ^= s[left];
10         s[left]  ^= s[right];
11         ++left;
12         --right;
13     }
14 }
15 
16 int findch(char* s, char c, int n)
17 {
18     int ret, len = strlen(s);
19     for (ret = n; ret < len; ++ret)
20     {
21         if (s[ret] == c)
22         {
23             return ret;
24         }
25     }
26     return -1;
27 }
28 
29 char* reverse(char* s)
30 {
31     reverse_(s, 0, strlen(s) - 1);
32     int left = 0, right = findch(s, '.', left);
33     while (right != -1)
34     {
35         reverse_(s, left, right - 1);
36         left = right + 1;
37         right = findch(s, '.', left);
38     }
39     reverse_(s, left, strlen(s) - 1);
40     return s;
41 }
42 
43 int main()
44 {
45     char s[100];
46     while (cin >> s)
47     {
48         cout << reverse(s) << endl;
49     }
50     return 0;
51 }


如果是时间复杂度呢?
这里由个限制,就是只有两个 . 符号时才成立。使用字符串数组存储字符串,将首尾字符串指针交换即可。
例如 mail.netease.com
存在于字符串指针数组中:
mail
.
netease
.
com
将指向 mail 和 指向 com 的两个字符串指针交换即可。
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     char* s[100];
 7     int i;
 8     for (i = 0; i < 100++i)
 9     {
10         s[i] = new char[100];
11     }
12     char c;
13     i = 0;
14     int j = 0;
15     // while (cin >> c)
16     // while (scanf("%c", &c))
17     while (c = getchar())
18     {
19         if (c == '\n')
20         {
21             break;
22         }
23         if (c != '.')
24         {
25             s[i][j] = c;
26             ++j;
27             s[i][j] = '\0';
28         }
29         else
30         {
31             // s[i][j] = '\0';
32             ++i;
33             s[i][0= c;
34             s[i][1= '\0';
35             j = 0;
36             ++i;
37         }
38     }
39     char* t = s[0];
40     s[0= s[i];
41     s[i] = t;
42     for (j = 0; j <= i; ++j)
43     {
44         cout << s[j];
45     }
46     cout << endl;
47     return 0;
48 }
posted on 2011-04-25 23:18 unixfy 阅读(242) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理