Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42779
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-28 00:25
个人简介

加油

文章分类

全部博文(10)

文章存档

2015年(1)

2014年(8)

2013年(1)

我的朋友
最近访客

分类: C/C++

2014-11-09 21:17:58

题目描述:有一个字符串,前部分是英文,后部分是中文,将该字符串进行处理,翻转中英文部分位置。如将“abcd中国”变成“中国abcd”。
方法一:

点击(此处)折叠或打开

  1. void reverseString1(std::string & s)
  2. {
  3.     std::cout << s << std::endl;
  4.     std::cout << s.size() << "\t" << s.length() << std::endl;
  5.     string tmp(s);
  6.     int i;
  7.     //查找中文的起始位置。
  8.     for(i = 0;i < s.length();++i)
  9.     {
  10.         if ( (s[i] >= 'A' && s[i] <= 'Z') || s[i] >= 'a' && s[i] <= 'z')
  11.             ;
  12.         else break;
  13.     }
  14.     //先赋值中文部分,再赋值英文部分。当j越界时就到原字符串的起始位置。
  15.     for (int j = i;j < s.length() + i;++j)
  16.     {
  17.         tmp[j-i] = s[j % s.length()];
  18.     }

  19.     s = tmp;

  20.     std::cout << tmp << std::endl;
  21. }
时间和空间复杂度都是O(n);

方法二:

点击(此处)折叠或打开

  1. //翻转pa,pb指向的一段字符串。
  2. void Reverse(char *pa,char *pb)
  3. {
  4.     assert(pa && pb);
  5.     char tmp;
  6.     for(;pa <= pb;)
  7.     {
  8.         tmp = *pa;
  9.         *pa = *pb;
  10.         *pb = tmp;

  11.         ++pa;
  12.         --pb;
  13.     }
  14. }


  15. void ReverseString2(std::string & s)
  16. {
  17.     std::cout << s << std::endl;
  18.     int i;
  19.     //找到中英文分界
  20.     for(i = 0;i < s.length();++i)
  21.     {
  22.         if ( (s[i] >= 'A' && s[i] <= 'Z') || s[i] >= 'a' && s[i] <= 'z')
  23.             ;
  24.         else break;
  25.     }
  26.     //找到中英文部分的分界线,翻转三次,即可。时间复杂度O(n),空间复杂度O(1)
  27.     Reverse(&s[0], &s[i - 1]);
  28.     Reverse(&s[i], &s[s.size() - 1]);
  29.     Reverse(&s[0], &s[s.size() - 1]);
  30.     std::cout << s << std::endl;
  31. }
如有更好的方法,欢饮相互交流。
阅读(1332) | 评论(0) | 转发(0) |
0

上一篇:算法,约瑟夫环

下一篇:IT女的求职之感

给主人留下些什么吧!~~