题目一:字符串翻转
题目描述:
输入一给英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如:输入“I am a student.”,输出为“student. a am I”;
思路:
- 第一步:对整个字符串进行逆置,例如就是将“I am a student.”逆置为".tneduts a ma I"
- 第二步:对句子中的每个单词在进行逆置,就得到“student. a am I”
代码:
//字符串逆置模块
void Reverse(char *pbegin,char *pend)
{
if(pbegin == pend || pend == nullptr)
return;
while(pbegin < pend)
{
char tmp = *pbegin;
*pbegin = *pend;
*pend = tmp;
pbegin++;
pend--;
}
}
//翻转字符串句子
char *ReverSen(char *str)
{
if(str == nullptr)
return nullptr;
char *pbegin = str;
char *pend = str;
while(*pend != '\0')
pend++;
pend--;
Reverse(pbegin,pend);//翻转整个句子 即就是将“I am a student.”翻转为“.tneduts a ma I”
//翻转句子中的每个单词
pbegin = pend = str;
while(*pbegin != '\0')
{
if(*pbegin == ' ')
{
pbegin++;
pend++;
}
else if(*pend == ' '|| *pend == '\0')
{
Reverse(pbegin,--pend);
pbegin = ++pend;
}
else
pend++;
}
return str;
}
题目二:左旋转字符串
题目描述:
字符串中的左旋操作就是把字符串前面的若干字符转移到字符串的尾部。例如:给定“abcdefg”和2,输出“cdefgab”
思路:
- 第一步:根据k值,将字符串分为两部分,题目例子就是分为:ab 和 cdefg
- 第二步:对每一部分分别进行逆置,即为ba和gfedc
- 第三步:对整个字符串在进行一次逆置,即得到cdefgab
代码:
//调用题目一中的字符串逆置函数
char* LeftRotate(char *str,int k)
{
if(str != nullptr)
{
int len = strlen(str);
if(len > 0 && k > 0 && k < len)
{
char *firststart = str;
char *firstend = str + k - 1;
char *secondstart = str + k;
char *secondend = str + len - 1;
//翻转前面的部分
Reverse(firststart,firstend);
//翻转后面的部分
Reverse(secondstart,secondend);
//翻转整个字符串
Reverse(firststart,secondend);
}
}
return str;
}