輸入乙個英文句子,翻轉句子中單詞的順序,要求單詞內字元的順序不變。標點視為單詞的一部分,單詞間以空格分開。
顯然,先將整個字串翻轉,再翻轉以空格隔開的各個小區間即可。 這裡需要用空格將字串分成多個小區間,這種需求在split等函式中也有。
上**
#include #include // 翻轉p到q之間的內容,包括p和q
void rev_by_char(char *p, char *q)
while (p < q)
}// 是否空格
int is_space(int ch)
return 0;
}// 按單詞翻轉
void rev_by_word(char *p, int (*f)(int))
int size = strlen(p);
if (size == 0)
char *end = p + size - 1;
char *pre = p;
char *cur = p;
while (cur <= end)
rev_by_char(pre, cur - 1);
++cur;
pre = cur;
} rev_by_char(pre, cur - 1);
}void test(char *p)
int main() ;
test(a);
} ;test(a);
} ;test(a);
} ;test(a);
} ;test(a);
} ;test(a);
}}
執行結果:
[root@localhost fall]# g++ test.cc -o ts && ./ts
pre : [i am a student.]
post: [student. a am i]
pre : [ i am a student.]
post: [student. a am i ]
pre : [i am a student. ]
post: [ student. a am i]
pre :
post:
pre : [a]
post: [a]
pre : [ ]
post: [ ]
rev_by_word函式稍加改造,就可以用於split:
#include #include #include #include // 是否空格
int is_space(int ch)
return 0;
}//
void split(const std::string &s, std::vector&vs, int (*f)(int))
std::string::const_iterator it = s.begin();
std::string::const_iterator pre = it;
std::string::const_iterator itend = s.end();
while (it < itend)
vs.push_back(std::string(pre, it));
++it;
pre = it;
} vs.push_back(std::string(pre, it));
}void test(const std::string &s)
}int main()
}
執行結果:
[root@localhost fall]# g++ test.cc -o ts && ./ts
pre : [i am a student.]
0 [i]
1 [am]
2 [a]
3 [student.]
pre : [ i am a student.]
0 1
2 [i]
3 [am]
4 [a]
5 [student.]
pre : [i am a student. ]
0 [i]
1 [am]
2 [a]
3 [student.]
4 pre :
pre : [a]
0 [a]
pre : [ ]
0 1
split還可以加上兩個引數,以決定: 1.多個連續空格是否合併,2.支援split出前幾個元素
#include #include #include #include /*
* split("a bc d ", " ", vs, true, -1);
*/void split(const std::string &s,
const std::string &seps,
std::vector&vs,
bool do_not_merge = false,
int n = -1)
static const std::string __s_empty;
std::string::const_iterator it = s.begin();
std::string::const_iterator pre = it;
std::string::const_iterator itend = s.end();
while (it < itend)
if (pre < it || do_not_merge)
} ++it;
pre = it;
} if (pre < it || do_not_merge)
}void test(const std::string &s)
}int main()
}
總結一下這個問題,實際上是一種對陣列做切分,再對每個區間做操作的框架:
以字串為例:已知p和size
itend <- p+size
it <- p
pre <- p
while (it < itend)
// 元素符合某條件
do_something(pre, it); // 取出前閉後開區間 [pre, it) 中的內容,完成某個任務。 注意,如果pre
++it;
pre = it; }
// 處理結尾. 結尾也視為分隔符。
do_something(pre, it);
翻轉字串 翻轉單詞字串
將一句話裡面的單詞進行倒置,標點符號不倒換。比如一句話 i come from china.倒換後變成 china.from come i 解析 解決該問題可以分為兩步,第一步全盤置換為 anihc morf emoc i 第二部對每個單詞進行逐步翻轉,如果不是空格,則開始翻轉單詞。具體 如下 in...
字串 單詞翻轉
給定乙個句子,翻轉其中的單詞 單詞之間由不確定的空格分隔 如 i come from china china from come i 基本思路 讀入字串,按照空格,單詞依次讀取進乙個 單詞表中,而後反向拼接單詞表即可 注意點 空格可能包含多個,讀取終止條件是,讀取空格時遇到了字元,讀取單詞時遇到了空...
字串單詞翻轉
題目要求 將字串以詞為單位進行翻轉。如 a bc def gh ij kml 變成 kml ij gh def bc a 時間複雜度o n 空間複雜度o 1 思路 先將整個字串按字母進行翻轉,然後再逐個單詞翻轉。如下 include using namespace std void wordturn...