剑指Offer——面试题58:翻转字符串

题目一:翻转单词顺序

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
#include<iostream>
using namespace std;
void Reverse(char* pBegin, char* pEnd){  // 反转字符串 
	if(pBegin==NULL || pEnd==NULL) return;
	while(pBegin<pEnd){
		char temp=*pBegin;
		*pBegin=*pEnd;
		*pEnd=temp;
		
		pBegin++; pEnd--;
	}
}
char* ReverseSentence(char* pData){
	if(pData==NULL) return NULL;
	
	char* pBegin=pData;
	char* pEnd=pData;
	while(*pEnd!='\0') pEnd++;
	pEnd--;
	
	// 翻转整个句子
	Reverse(pBegin, pEnd); 
	
	// 翻转句子中的每个单词
	pBegin=pEnd=pData;
	while(*pBegin!='\0'){
		if(*pBegin==' '){  // 若字符串开始有空格, 需要跳过 
			pBegin++; pEnd++;
		}else if(*pEnd==' ' || *pEnd=='\0'){
			Reverse(pBegin, --pEnd);
			pBegin=++pEnd;
		}else pEnd++;
	} 
	return pData;
}
int main() {
	char str[]="I am a student.";
	printf("%s", ReverseSentence(str));
	return 0;
}

题目二:左旋转字符串

题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。
#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<cstring>
#include<stack>
#include<cmath>
using namespace std;
void Reverse(char* pBegin, char* pEnd){  // 反转字符串 
	if(pBegin==NULL || pEnd==NULL) return;
	while(pBegin<pEnd){
		char temp=*pBegin;
		*pBegin=*pEnd;
		*pEnd=temp;
		
		pBegin++; pEnd--;
	}
}
char* LeftRotateString(char* pStr, int n){
	if(pStr!=NULL){
		int nLength=static_cast<int>(strlen(pStr));
		if(nLength>0 && n>0 && n<nLength){
			char* pFirstStart=pStr;
			char* pFirstEnd=pStr+n-1;
			
			char* pSecondStart=pStr+n;
			char* pSecondEnd=pStr+nLength-1;
			
			// 翻转字符串的前面 n 个字符
			Reverse(pFirstStart, pFirstEnd);
			
			// 翻转字符串的后面部分 
			Reverse(pSecondStart, pSecondEnd);
			
			// 翻转整个字符串
			Reverse(pFirstStart, pSecondEnd);
		}
	}	
	return pStr; 
}
int main() {
	char str[]="abcdefg";
	printf("%s", LeftRotateString(str, 2));
	return 0;
}
发布了74 篇原创文章 · 获赞 75 · 访问量 4048

猜你喜欢

转载自blog.csdn.net/qq_35340189/article/details/104494450