字符串转换
廖家龙 用心听,不照做

题目描述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
写一个字符串转换函数,输入以驼峰命名法为格式的字符串,输出相应的以下划线命名法为格式的字符串

要求:
1. 只遍历输入字符串一遍
2. 注意合理处理连续的大写字母如 HTTP
3. 请提供单元测试,不局限于下面的例子
4. 语言不限

输入:myFirstName
输出:my_first_name

输入:OnlineUsers
输出:online_users

输入:Address
输出:address

输入:validHTTPRequest
输出:valid_http_request

解法1:

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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <iostream>
#include <string>

using namespace std;

//字符串转换函数
string conversionString(string s) {

string res; //res是返回的最终结果

if (s.size() == 0) return 0; //判断输入值为空的情况

for (int i = 0 ; i < s.size() ; ++i) {

//第一种情况:输入 validHTTPRequest
//如果该字符是大写并且左右两边都是大写的话,只需要把该字符转换成小写就可以了
if (s[i - 1] >= 'A' && s[i - 1] <= 'Z' &&
s[i] >= 'A' && s[i] <= 'Z' &&
s[i + 1] >= 'A' && s[i + 1] <= 'Z') {

res.push_back(s[i] - 'A' + 'a');

//第二种情况:输入 HTTPNameHTTP 或 HTTP
//字符串开头和结尾都是大写的情况下,也只需要把该字符转换成小写就可以了
} else if ((i == 0 || i == s.size() - 1) && s[i] >= 'A' && s[i] <= 'Z') {

res.push_back(s[i] - 'A' + 'a');

//第三种情况:除了以上两种特殊情况,其他字符为大写的时候
} else if (s[i] >= 'A' && s[i] <= 'Z') {

res.push_back('_');
res.push_back(s[i] - 'A' + 'a');

//第四种情况:字符为小写的时候
} else res.push_back(s[i]);
}

return res; //for循环结束后,返回res结果
}

//以下是测试代码:

void test1() {

string s, res;

s = "HTTP";

res = conversionString(s);
cout << "输入:HTTP,输出:" << res << endl;
}

void test2() {

string s, res;

s = "HTTPNameHTTP";

res = conversionString(s);
cout << "输入:HTTPNameHTTP,输出:" << res << endl;
}

void test3() {

string s, res;

s = "myFirstName";

res = conversionString(s);
cout << "输入:myFirstName,输出:" << res << endl;
}

void test4() {

string s, res;

s = "OnlineUsers";

res = conversionString(s);
cout << "输入:OnlineUsers,输出:" << res << endl;
}

void test5() {

string s, res;

s = "Address";

res = conversionString(s);
cout << "输入:Address,输出:" << res << endl;
}

void test6() {

string s, res;

s = "validHTTPRequest";

res = conversionString(s);
cout << "输入:validHTTPRequest,输出:" << res << endl;
}

int main(int argc, char *argv[]) {

test1();
test2();
test3();
test4();
test5();
test6();
}