算法:字符串翻转

1390阅读 0评论2014-11-09 bitpeng
分类:C/C++

题目描述:有一个字符串,前部分是英文,后部分是中文,将该字符串进行处理,翻转中英文部分位置。如将“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. }
如有更好的方法,欢饮相互交流。
上一篇:算法,约瑟夫环
下一篇:IT女的求职之感