单词反转算法
问题描述:颠倒一个句子中的词的顺序,比如将
Alice call Jack
转换为Jack call Alice
,实现速度最快,移动最少。
算法思想
- 写一个反转字符串的函数(二分,语言自带都可以)
- 遍历字符串,然后把每个单词都翻转过来
- 最后把整个字符串翻转过来。
初始状况
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A | l | i | c | e | 32 | c | a | l | l | 32 | J | a | c | k | \0 |
将所有单词翻转后
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
e | c | i | l | A | 32 | l | l | a | c | 32 | k | c | a | J | \0 |
最后再全部翻转
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
J | a | c | k | 32 | c | a | l | l | 32 | A | l | i | c | e | \0 |
void reverse_word(char* word_start, int word_len) {
char* left = word_start;
char* right = word_start + word_len - 1;
for (; left < right; right--, left++)
{
swap(*left, *right);
}
}
void reverse(char* str) {
char* current_pos = str;
while (*current_pos) {
while (*current_pos == ' ') current_pos++;
char* word_start = current_pos;
while (*current_pos != ' ' && *current_pos) current_pos++;
reverse_word(word_start, current_pos - word_start);
}//遍历结束
reverse_word(str, strlen(str));
}
// 逆转测试函数
void testReverse(void) {
char str[128] = "Alice call Jack";
reverse(str);
std::cout << "处理后:" << str << std::endl;
}
int main(void) {
testReverse();
system("pause");
}
常见的快乐算法 文章被收录于专栏
一些简单的算法题目,不想浪费这些快乐