面试题42:翻转单词顺序(句子反转)
2017-12-06 16:50
281 查看
题目:给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词之间只有一个空格,前后没有空格。 比如: (1) “hello xiao mi”-> “mi xiao hello”
思路:
第一步:翻转句子中所有的字符。比如翻转“hello xiao mi”,变成“im oaix olleh”
第二步:再翻转每个单词的顺序,就变成了“mi xiao hello”
这种思路的关键在于翻转一段子字符串。
翻转句子的函数为:
主函数:
以上方法,直接就在原来的字符串上操作,无需额外空间。
思路:
第一步:翻转句子中所有的字符。比如翻转“hello xiao mi”,变成“im oaix olleh”
第二步:再翻转每个单词的顺序,就变成了“mi xiao hello”
这种思路的关键在于翻转一段子字符串。
void ReverseWord(char* begin, char* end) { if(begin == NULL || end == NULL) { return; } char tmp; while(begin < end) { tmp = *begin; *begin = *end; *end = tmp; begin++; end--; } }
翻转句子的函数为:
void ReverseSentence(char* sentence) { int size = (int)strlen(sentence); ReverseWord(sentence, sentence+size-1);//最后一位是'\0',无需处理 int start = 0, i = 0; while(i <= size) { if(sentence[i] == ' ' || sentence[i] == '\0') { int sub_size = i-start; if(sub_size > 0) { ReverseWord(sentence + start, sentence + start + sub_size - 1); start = i+1; } } i++; } }
主函数:
int main() { while(true) { char str[1000]; char* sentence = gets(str); ReverseSentence(sentence); printf("%s\n", sentence); } return 0; }
以上方法,直接就在原来的字符串上操作,无需额外空间。
相关文章推荐
- 一个面试题:翻转句子中单词的顺序
- [剑指offer][面试题42]翻转单词顺序 VS 左旋转字符串
- 面试题42:翻转单词顺序VS左旋转字符串
- 剑指offer-面试题42:翻转单词顺序VS左旋转字符串
- 面试题42:翻转单词的顺序,左旋转字符串
- 面试题38:翻转句子中单词的顺序,单词内字符的顺序不变
- 面试题42:翻转单词顺序 || 左旋字符串
- 程序员面试题精选100题(07)-翻转句子中单词的顺序[算法]
- 剑指Offer----面试题42(1):翻转单词顺序
- 剑指Offer面试题42(Java版):反转单词顺序VS左旋转字符串
- 剑指offer——面试题42:翻转单词顺序VS左旋转字符串
- 程序员面试题精选100题(07)-翻转句子中单词的顺序[算法]
- 面试题42:翻转单词顺序
- 翻转句子中单词的顺序 面试题
- 翻转句子中单词的顺序和字符串的旋转操作 c++面试题
- 【剑指offer】面试题42:单词翻转顺序&左右旋转字符串
- 剑指offer面试题42_1翻转单词顺序(java实现)
- 【剑指offer】6.3知识迁移能力——面试题42:翻转单词顺序VS左旋转字符串
- 面试题:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。
- 剑指offer 面试题42 翻转单词顺序