反转字符串中的单词
给定一个字符串,你需要反转字符串中的每个单词字符顺序,同时仍保留空格和单词的初始顺序。
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
示例1:
输入: "Let's take LeetCode contest" 输出: "s'teL ekat edoCteeL tsetnoc"
解法一:遍历+reversed
思路:首先将字符串以空格来分割成不同的字符串,然后通过遍历将每个字符串然后将其反转。
func reverseWords(_ s: String) -> String { guard s.count > 0 else { return ""} let words = s.split(separator: " ") var result = "" words.forEach { result += String($0.reversed()) result += " " } result.removeLast() return result } let words = reverseWords("Let's take LeetCode contest") print(words)
下面我们在playground下面运行的结果,对应每行的效果:
解法二:双指针+异或交换法
双指针法在运行的过程中会有一个头指针固定,尾指针不断向前移动,遇到空格即为头指针和尾指针之间为一个单词,然后对这个单词进行反转即可。
而使用的交换算法是反转字符串中最快速的异或交换法,不过实际上还是一个双指针的解法。
public: // 反转字符串 void reverseString(int front, int tail, string& str) { while (front < tail) { str[front] ^= str[tail]; str[tail] ^= str[front]; str[front++] ^= str[tail--]; } } // 确定单词边界 string reverseWords(string s) { int front = 0; for (int i = 0; i < s.length(); i++) { if (s[i] == ' ') { reverseString(front, i - 1, s); front = i + 1; } } reverseString(front, s.length() - 1, s); return s; }
上面是反转字符串的进阶版本,本人觉得第二种方法的异或思想很不错值得大家参考,希望对大家有帮助,谢谢!!!