剑指offer——翻转字符串*

mac2026-05-25  4

题目一:翻转单词顺序

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。 

 

解题思路:

先将整个字符串翻转,在分别把每个单词翻转。

 

class Solution { public: void Reverse(string& str,int begin,int end){ while(begin<end){ swap(str[begin],str[end]); begin++; end--; } } string ReverseSentence(string str) { if(str.size()==0) return ""; //先将整个字符串翻转 Reverse(str,0,str.size()-1); //分别将每个单词翻转 int begin=0; int end=0; while(str[end]!='\0'){ end++; if(str[end]==' '||str[end]=='\0'){//遇到空格或者末尾的‘\0’将前一个单词翻转 end--; Reverse(str,begin,end); end+=2; begin=end; } } return str; } };

书上的用指针操作的方法: 

char* ReverseSentence(char* str) { if(str==nullptr) return nullptr; char* begin=str; char* end=begin; while(*end!='\0'){ end++; } end--; Reverse(begin,end); begin=str; end=str; while(*end!='\0'){ end++; if(*end==' '||*end=='\0'){ end--; Reverse(begin,end); end+=2; begin=end; } } return str; } void Reverse(char* begin,char* end){ if(begin==nullptr||end==nullptr) return; while(begin<end){ char temp=*begin; *begin=*end; *end=temp; begin++; end--; } }

 

题目二:左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。

 

解题思路:

先翻转0~n-1的子串,再翻转剩下的子串,最后翻转整个字符串

如对“abcdefg”进行操作:

翻转0~1的子串:bacdefg翻转2~6的子串:bagfedc翻转整个字符串:cdefgab class Solution { public: string LeftRotateString(string str, int n) { if(str.size()==0) return ""; //翻转0~n-1的字符 Reverse(str,0,n-1); //翻转n~末尾字符 Reverse(str,n,str.size()-1); //翻转整个字符串 Reverse(str,0,str.size()-1); return str; } void Reverse(string &str,int begin,int end){ while(begin<end){ swap(str[begin],str[end]); begin++; end--; } } };

 

最新回复(0)