今天的这道题目算是有点难度的题目,整体来说考察的逻辑挺难的,下面给出实例
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
首先我们的需要考虑字符串中有很多空格的情况,因为后面得到的字符串是只有单词之间有空格的,所以我们先需要做去空格操作:代码如下:(我们需要采用双指针的方法)
void DeleteSpace(string s) {
int fastindex = 0;//定义快指针
int slowindex = 0;//定义慢指针
for (; fastindex < s.size(); fastindex++) {
if (s[fastindex] != ' ') {//如果找到单词里面的字母了
if (slowindex != 0)s[slowindex++] = ' ';//如果慢指针往后移动了,就给个空格在下一个单词的前面
while (fastindex < s.size() && s[fastindex] != ' ') {//将单词里面的字母赋值给慢指针
s[slowindex++] = s[fastindex++];
}
}
}
s.resize(slowindex);
}
进行完去空格操作后,就要对字符串进行翻转了;下面是翻转的函数:
void Reversestring(string s,int start,int end) {
for (int i = start,j=end; i < j; i++,j--) {
swap(s[i], s[j]);
}
}
然后再对一个个单词进行翻转
string reversewords(string s) {
Delete(s);//首先去空格操作
Reversestring(s, 0, s.size() - 1);//将整个字符串进行翻转
int start = 0;
for (int i = 0; i <= s.size();i++) {
if (i==s.size() || s[i] = ' ') {//如果遍历到了字符串尾部 或者遍历到了空格,就翻转这个单词
Reversestring(s, start, i - 1);
start = i + 1;//让start+1跳过空格
}
}
return s;
}
今天的分享就到这里,点个赞吧
!