题目描述
  这是一道经典的字符串题目,要求翻转字符串的每一个部分,每一个部分由.分隔开,但部分内部保持原来的顺序,并且只能够在原字符串上操作,不能使用额外的内存空间(允许用一个char的空间),也不能够使用<string>的reverse()函数。
思路
  字符串翻转的题目相信大家都见过不少,最基本的思路就是首尾交换,不断向中间遍历。分部分翻转其实也不难,我们在写python或者java的时候经常会用到split(),将一个字符串按照分隔符划分成一个字符串数组,但是在这里题目只允许在原串上操作。我们只好换个思路了。
  既然翻转一次不行,那我们干脆就翻转两次。第一次对整个字符串进行翻转,这样使得部分之间的顺序可以翻转。然后我们再对每个部分的内部进行翻转,还原成原来的顺序。这样一分析,是不是就很简单了。
实现
  整个程序有很多字符串翻转的操作,我们干脆写一个reverse()函数,方便调用。
| 12
 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
 
 | #include <iostream>#include <string>
 using namespace std;
 
 void reverse(string& str, int begin, int end) {
 
 for (int i = 0; i <= (end - begin) / 2; i++) {
 char tmp = str[begin + i];
 str[begin + i] = str[end - i];
 str[end - i] = tmp;
 }
 }
 
 
 void reverseString(string& str) {
 int size = str.size();
 reverse(str, 0, size - 1);
 int j;
 for (int i = 0; i < size; i=j+1) {
 for (j = i; j < size; j++) {
 if (str[j] == '.' || j == size - 1) {
 break;
 }
 }
 if (j == size - 1) {
 j++;
 }
 reverse(str, i, j - 1);
 }
 }
 
 int main() {
 string str;
 cin >> str;
 reverseString(str);
 cout << str << endl;
 return 0;
 }
 
 | 
运行结果:
小结
  这道题是我在面试过程中碰到的,之前没有复习到,短时间内完成coding还是有点困难,尤其是一些边界问题,稍微不注意就容易出错。希望通过分享给大家一些帮助,谢谢!