方法一:
点击(此处)折叠或打开
-
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;
- }
方法二:
点击(此处)折叠或打开
-
//翻转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;
- }