0 问题描述
给定一个字符串,逐个翻转字符串中的每个单词。
示例:
输入: "the sky is blue"
,
输出: "blue is sky the"
.
1 方法一
解题思路:
- 对整个字符串进行反转,实现结果
eulb si yks eht
; - 遍历字符串,以空格
' '
为标识检索单词,对单词进行反转,实现结果blue is sky the
。
注:该方法不能实现对多余空格' '
的删除,比如输入:" the sky “,输出:” sky the "。
示例代码:
//@brief 反转函数
//@str 字符串
//@begin 起始位置,end 终点位置
void CExmp::reverse(char *str, const int &begin, const int &end)
{
if (NULL == str || begin == end)
return;
int len = (end - begin + 1) / 2;
int i = begin, j = end;
while (len-- > 0)
{
auto tem = str[i];
str[i] = str[j];
str[j] = tem;
++i;
--j;
}
}
//@brief 反转方法
void CExmp::reverse_str(char *str)
{
if (NULL == str)
return;
int len = strlen(str);
int begin = 0, end = len - 1;
reverse(str, begin, end);
end = begin;
while (len-- > 0)
{
if (str[end] == ' ')
{
reverse(str, begin, end - 1);
++end;
begin = end;
}
else
++end;
}
reverse(str, begin, end - 1);
}
2 方法二
解题思路:
- 遍历字符串,将字符串中单词存储在
vector<string> words;
容器中,剔除了所有的空格' '
; - 调用
reverse()
方法对容器words
中的单词进行反转; - 清空字符串
str
,遍历words
,将words
中元素依次拼接到字符串str
末尾,并添加空格' '
。
注:该方法不仅能实现字符串单词的反转,而且还能删除字符串中多余的空格。
void CExmp::reverse_thi_str(string &str)
{
if (str.empty())
return;
vector<string> words;
auto p1 = str.begin();
auto p2 = str.begin();
auto p3 = str.end();
while (p2 != p3)
{
while (' ' == *p1 && p1 != p3)
++p1;
p2 = p1;
while (' ' != *p2 && p2 != p3)
++p2;
if (p1 != p3)
words.push_back(string(p1, p2));
p1 = p2;
}
reverse(words.begin(), words.end());
str.clear();
for (auto i : words)
str += i + " ";
if (str.length() > 0)
str.erase(str.length() - 1, 1);
}
3 方法三
解题思路:
- 构建输入字符串流对象
istringstream is(str);
,初始化为str
; - 读取字符串流内容,自动以空格
' '
为标识,读取单个单词; - 将读取的单词添加空格
' '
后,拼接在字符串str
前面,实现单词反转。
注:该方法简洁实用,不仅能实现字符串单词的反转,而且还能删除字符串中多余的空格。关于字符串流对象,参阅C++ istringstream、ostringstream、stringstream类用法详解
void CExmp::reverse_sec_str(string &str)
{
if (str.empty())
return;
istringstream is(str);
string temp;
is >> str;
while (is >> temp)
str = temp + " " + str;
if (!str.empty() && str[0] == ' ')
str = "";
}