题目
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
代码实现
方法一:双指针法
public class Solution
{
public string ReverseWords(string s)
{
int Head = 0, Rear = 0;
string Ans = "";
for(int i = 0; i < s.Length; i++)
if(i == s.Length - 1 || s[i + 1] == ' ')
{
Rear = i;
for(int j = Rear; j > Head - 1; --j)
Ans += s[j];
Ans += " ";
Head = i + 2;
}
return Ans.Substring(0,s.Length);
}
}
方法二:双指针法+异或交换法
class Solution {
public:
string reverseWords(string s)
{
int Head = 0, Rear = 0;
for(int i = 0; i < s.size(); i++)
if(s[i] == ' ')
{
Rear = i - 1;
while (Head < Rear)
{
s[Head] ^= s[Rear];
s[Rear] ^= s[Head];
s[Head++] ^= s[Rear--];
}
Head = i + 1;
}
Rear = s.size() - 1;
while (Head < Rear)
{
s[Head] ^= s[Rear];
s[Rear] ^= s[Head];
s[Head++] ^= s[Rear--];
}
return s;
}
};
实验结果
方法一:双指针法
执行结果:超出时间限制
执行结果:通过
执行用时 :16 ms, 在所有 C++ 提交中击败了97.44%的用户
内存消耗 :11.6 MB, 在所有 C++ 提交中击败了93.98%的用户