前言
題目:輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。例如輸入字符“student. a am I”,輸出為"I am a student.".這個題目很常見,據說很多公司都多次拿來作面試題目。這裡主要是因為網上很多相關代碼都是照抄何海濤的《劍指offer》,c++風格的代碼無法接受,所以這裡貼出我的ac代碼
思路
這個題目的思路比較簡單,分兩步即可:
翻轉句子中所有的字符,例如翻轉“student. a am I”中所有的字符得到“I ma a .tneduts”,此時不但翻轉了句子中的單詞的順序,連單詞內的字符順序也被翻轉了
再翻轉每個單詞中字符的順序,就得到“I am a students.”了
字符串翻轉的代碼實現很簡單,我貼出我寫的c代碼:
[cpp]
void reverse_word(char *str, int begin, int end)
{
char temp;
while (begin < end) {
temp = *(str + begin);
*(str + begin) = *(str + end);
*(str + end) = temp;
begin ++;
end --;
}
}
void reverse_word(char *str, int begin, int end)
{
char temp;
while (begin < end) {
temp = *(str + begin);
*(str + begin) = *(str + end);
*(str + end) = temp;
begin ++;
end --;
}
}
示例
[html]
題目描述:
JOBDU最近來了一個新員工Fish,每天早晨總是會拿著一本英文雜志,寫些句子在本子上。同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,“student. a am I”。後來才意識到,這家伙原來把句子單詞的順序翻轉了,正確的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?
輸入:
每個測試案例為一行,表示一句英文句子。
我們保證一個句子的單詞數不會超過600,每個單詞的長度也不會超過30。但是需要注意的是Fish是個不拘小節的人,有時候兩個單詞中間可能會有很多空格。為了方便起見,你可以認為一行的字符總數不會超過50000個,標點符號可以和普通字母一樣處理。
輸出:
對應每個測試案例,把翻轉後的正確的句子單獨輸出一行。
樣例輸入:
student. a am I
I'm a Freshman and I like JOBDU!
樣例輸出:
I am a student.
JOBDU! like I and Freshman a I'm
題目描述:
JOBDU最近來了一個新員工Fish,每天早晨總是會拿著一本英文雜志,寫些句子在本子上。同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,“student. a am I”。後來才意識到,這家伙原來把句子單詞的順序翻轉了,正確的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?
輸入:
每個測試案例為一行,表示一句英文句子。
我們保證一個句子的單詞數不會超過600,每個單詞的長度也不會超過30。但是需要注意的是Fish是個不拘小節的人,有時候兩個單詞中間可能會有很多空格。為了方便起見,你可以認為一行的字符總數不會超過50000個,標點符號可以和普通字母一樣處理。
輸出:
對應每個測試案例,把翻轉後的正確的句子單獨輸出一行。
樣例輸入:
student. a am I
I'm a Freshman and I like JOBDU!
樣例輸出:
I am a student.
JOBDU! like I and Freshman a I'm
ac代碼
[cpp]
#include <stdio.h>
#include <string.h>
void reverse_word(char *str, int begin, int end);
int main(void)
{
int st, ed, len;
char str[50001];
while (gets(str)) {
len = strlen(str);
reverse_word(str, 0, len - 1);
for (st = ed = 0; ed < len;) {
while (*(str + ed) != ' ' && *(str + ed) != '\0') {
ed ++;
}
reverse_word(str, st, ed - 1);
st = ed;
while (*(str + st) == ' ') {
st ++;
}
ed = st;
}
puts(str);
}
return 0;
}
void reverse_word(char *str, int begin, int end)
{
char temp;
while (begin < end) {
temp = *(str + begin);
*(str + begin) = *(str + end);
*(str + end) = temp;
begin ++;
end --;
}
}
/**************************************************************
Problem: 1361
User: wangzhengyi
Language: C
Result: Accepted
Time:50 ms
Memory:912 kb
****************************************************************/
#include <stdio.h>
#include <string.h>
void reverse_word(char *str, int begin, int end);
int main(void)
{
int st, ed, len;
char str[50001];
while (gets(str)) {
len = strlen(str);
reverse_word(str, 0, len - 1);
for (st = ed = 0; ed < len;) {
while (*(str + ed) != ' ' && *(str + ed) != '\0') {
ed ++;
}
reverse_word(str, st, ed - 1);
st = ed;
while (*(str + st) == ' ') {
st ++;
}
ed = st;
}
puts(str);
}
return 0;
}
void reverse_word(char *str, int begin, int end)
{
char temp;
while (begin < end) {
temp = *(str + begin);
*(str + begin) = *(str + end);
*(str + end) = temp;
begin ++;
end --;
}
}
/**************************************************************
Problem: 1361
User: wangzhengyi
Language: C
Result: Accepted
Time:50 ms
Memory:912 kb
****************************************************************/