编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[]
的形式给出。
不要给另外的数组分配额外的控件,你必须通过原地修改输入数组,使用O(1)的额外空间解决这一个问题。
你可以假设数组中的所有字符都是ASCII码表中的可打印字符。
示例1:
输入:["h","e","l","l","o"] 输出:["o","l","l","e","h"]
示例2:
输入:["H","a","n","n","a","h"] 输出:["h","a","n","n","a","H"]
解法一:通过双指针
class Solution { func reverseString(_ s: inout [Character]) { var low = 0 var high = s.count - 1 while low < high { s.swapAt(low, high) low += 1 high -= 1 } } }
由于代码比较简单,不讲解,还有一种一行代码即可:
class Solution { func reverseString(_ s: inout [Character]) { s.reverse() } }
通过这个题目,发现另一种很不错的解法,是通过三次异或操作来交换两个值:
public void reverseString(char[] s) { int end = s.length - 1; int half = end / 2; for (int i = 0; i < half && end >= 0; ++i, --end) { s[i] ^= s[end]; s[end] ^= s[i]; s[i] ^= s[end]; } }
我是只想到了第一种方法和简写版的,通过这个题目还是了解到了异或在交换值中的使用,希望对大家有所帮助!!!