// 面试题58(一):翻转单词顺序
// 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
// 为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",
// 则输出"student. a am I"。
static char* reverse_sentence(char *str)
{
if(str == nullptr)
{
return nullptr;
}
char *start = str;
char *end = str;
while(*end++ != '\0');
end--;
// 翻转整个句子
_reverse(start, end);
// 翻转句子中的每个单词
start = end = str;
while(*start != '\0')
{
if(*start == ' ')
{
end = ++start;
}
else if(*end == ' ' || *end == '\0')
{
_reverse(start, end-1);
start = ++end;
}
else
{
end ++;
}
}
return str;
}
static void _reverse(char* start, char* end)
{
while (start<end)
{
auto temp = *start;
*start = *end;
*end = temp;
start++;
end++;
}
}
// 面试题58(二):左旋转字符串
// 题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
// 请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数
// 字2,该函数将返回左旋转2位得到的结果"cdefgab"。
static bool left_rotate(char*& str, uint32_t n)
{
if(str != nullptr)
{
auto len = strlen(str);
if(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 true;
}
}
return false;
}