题目描述:有一个字符串,前部分是英文,后部分是中文,将该字符串进行处理,翻转中英文部分位置。如将“abcd中国”变成“中国abcd”。
方法一:
-
void reverseString1(std::string & s)
-
{
-
std::cout << s << std::endl;
-
std::cout << s.size() << "\t" << s.length() << std::endl;
-
string tmp(s);
-
int i;
-
//查找中文的起始位置。
-
for(i = 0;i < s.length();++i)
-
{
-
if ( (s[i] >= 'A' && s[i] <= 'Z') || s[i] >= 'a' && s[i] <= 'z')
-
;
-
else break;
-
}
-
//先赋值中文部分,再赋值英文部分。当j越界时就到原字符串的起始位置。
-
for (int j = i;j < s.length() + i;++j)
-
{
-
tmp[j-i] = s[j % s.length()];
-
}
-
-
s = tmp;
-
-
std::cout << tmp << std::endl;
-
}
时间和空间复杂度都是O(n);
方法二:
-
//翻转pa,pb指向的一段字符串。
-
void Reverse(char *pa,char *pb)
-
{
-
assert(pa && pb);
-
char tmp;
-
for(;pa <= pb;)
-
{
-
tmp = *pa;
-
*pa = *pb;
-
*pb = tmp;
-
-
++pa;
-
--pb;
-
}
-
}
-
-
-
void ReverseString2(std::string & s)
-
{
-
std::cout << s << std::endl;
-
int i;
-
//找到中英文分界
-
for(i = 0;i < s.length();++i)
-
{
-
if ( (s[i] >= 'A' && s[i] <= 'Z') || s[i] >= 'a' && s[i] <= 'z')
-
;
-
else break;
-
}
-
//找到中英文部分的分界线,翻转三次,即可。时间复杂度O(n),空间复杂度O(1)
-
Reverse(&s[0], &s[i - 1]);
-
Reverse(&s[i], &s[s.size() - 1]);
-
Reverse(&s[0], &s[s.size() - 1]);
-
std::cout << s << std::endl;
-
}
如有更好的方法,欢饮相互交流。
阅读(1352) | 评论(0) | 转发(0) |