力扣-151. 反转字符串中的单词
2023-12-15 00:38:11
看下去,你一定可以理解此题,写的简单易懂
力扣题目
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = “the sky is blue”
输出:“blue is sky the”
示例 2:
输入:s = " hello world "
输出:“world hello”
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入:s = “a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
解题思路
1.通过removeElement函数来去掉字符串中多余的0;
2.通过revise函数先反转整个字符串;
3.在反转每一个单词,就达到了题目中的要求。
(反转每一个单词过程可以参考我的此篇文章-力扣-557. 反转字符串中的单词 III)
函数构成
1.反转函数
void revise(char* start, char* end)
{
char temp;
while (start < end)
{
temp = *end;
*end = *start;
*start = temp;
start++;
end--;
}
}
只需要输入反转的起始地址和终止地址即可完成反转
2.消除掉多余空格函数
int removeElement(char* str, int len, int val)
{
int slow = 0; //慢指针
int fast = 0; //快指针
for (fast = 0; fast < len; fast++)
{
if (val != str[fast])/*如果不是空格就赋值*/
{
if (slow != 0)/*确保字符串的最前边没有空格*/
{
str[slow] = ' ';
slow++;
}
}
while ((fast < len) && str[fast] != val)/*快指针遍历一个完整的单词赋值给慢指针*/
{
str[slow] = str[fast];
slow++;
fast++;
}
}
str[slow] = '\0';
return slow;
}
整体函数
void revise(char* start, char* end)
{
char temp;
while (start < end)
{
temp = *end;
*end = *start;
*start = temp;
start++;
end--;
}
}
int removeElement(char* str, int len, int val)
{
int slow = 0; //慢指针
int fast = 0; //快指针
for (fast = 0; fast < len; fast++)
{
if (val != str[fast])/*如果不是空格就赋值*/
{
if (slow != 0)/*确保字符串的最前边没有空格*/
{
str[slow] = ' ';
slow++;
}
}
while ((fast < len) && str[fast] != val)/*快指针遍历一个完整的单词赋值给慢指针*/
{
str[slow] = str[fast];
slow++;
fast++;
}
}
str[slow] = '\0';
return slow;
}
char* reverseWords(char* s)
{
char* start = NULL;
char* end = NULL;
int len = strlen(s);
int i = 0;
/*取得移除多余0后字符串的长度*/
len = removeElement(s, len, ' ');
/*反转全部字符串*/
revise(&s[0], &s[len - 1]);
/*反转每一个单词*/
start = s;/*字符串首地址赋值*/
for (i = 0; i < len; i++)
{
if (s[i] == ' ')
{
end = &s[i];/*记录空格的位置*/
revise(start, end - 1);
start = end + 1;/*记录空格后字符的位置*/
}
else if (s[i + 1] == '\0')/*最后一个单词特殊处理*/
{
end = &s[i];
revise(start, end);
start = NULL;
}
}
return s;
}
如果有需要可以跳转leetcode直接看我提交的解题:151. 反转字符串中的单词
文章来源:https://blog.csdn.net/ls3614140/article/details/134900172
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!