题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出”student. a am I”。
第一步:翻转句子中的所有字符,比如翻转”I am a student.”中的所有字符得到”.tneduts a ma I”,此时不但翻转了句子中单词的顺序,每个单词内的字符也被翻转了。第二步,再翻转每个单词中字符的顺序,就得到了”student. a am I”。
void Reverse(char* begin, char* end)
{
if (begin == NULL || end == NULL)
return;
while (begin < end)
{
char tmp = *begin;
*begin = *end;
*end = tmp;
begin++;
end--;
}
}
char* ReverseSentence(char* str)
{
if (str == NULL)
return NULL;
char* begin = str;
char* end = str;
while (*end != '\0')
{
end++;
}
end--;//因为此时end在\0处,所以需要向前一位到最后一个字符的位置
Reverse(begin, end);//翻转整个句子
//翻转句子中的每个单词
begin = end = str;
while (*begin != '\0')
{
if (*begin == ' ')
{
begin++;
end++;
}
//每一个单词当end为空格时旋转
else if (*end == ' ' || *end == '\0')
{
Reverse(begin, --end);
begin = ++end;
}
else
{
end++;
}
}
return str;
}
int main()
{
char str[] = "I am a student.";
char* ret = ReverseSentence(str);
cout << ret << endl;
system("pause");
return 0;
}
题目二:字符串的左旋操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋操作的功能。比如,输入字符串”abcdefg”和数字2,该函数将返回左旋转2位所得到的结果”cdefgab”.
我们可以考虑将字符串分为两部分,由于所传的数字是2,即我们要把它的前两个字符串移到后面,我们把前两个字符串当作第一部分,对它进行旋转得到”ba”,再将后面的字符当作另一部分进行旋转,得到”gfedc”,此时字符串变为”bagfedc”,再将它进行整体旋转,得到”cdefgab”,即将字符串左旋两位的结果。
void Reverse(char* begin, char* end)
{
if (begin == NULL || end == NULL)
return;
while (begin < end)
{
char tmp = *begin;
*begin = *end;
*end = tmp;
begin++;
end--;
}
}
char* LeftReverse(char* str, int n)
{
if (str != NULL)
{
int len = strlen(str);
if (len > 0 && n > 0 && n < len)
{
char* start1 = str;
char* end1 = str + n - 1;
char* start2 = str + n;
char* end2 = str + len - 1;
//翻转前n个字符
Reverse(start1, end1);
//翻转后面的字符
Reverse(start2, end2);
//翻转整个字符串
Reverse(start1, end2);
}
}
return str;
}
int main()
{
char str[] = "abcdefg";
char *ret = LeftReverse(str, 2);
cout << ret << endl;
system("pause");
return 0;
}