1.题目
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
2.示例
示例 1:
输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
提示:
1 <= s.length <= 105
s[i] 都是 ASCII 码表中的可打印字符
3.分析
此题首先想到的就是双指针移动法,一个从数组的第一个元素开始向后移动,另一个从数组的最后一个元素开始向前移动。两个指针每次都只移动一个位置。每次移动后,首先进行两个指针所代表的元素的比较,如果相同,就不进行两元素交换,否则进行交换。向后移动的指针所代表的下标移动要小于或等于向前移动的指针代表的下标值。
4.代码
void reverseString(char* s, int sSize) {
//char temp;//用于交换时的临时空间
//i,j分别代表两个前后指针;i<=j是循环是否继续进行的条件;i++,j--表示每次指针只移动一个位置
for(int i=0,j=sSize-1;i<=j;i++,j--){
//如果两个字母完全相同就不用交换了,直接进入下一轮循环。这里是用异或位运算进行比较,也可以直接比较是否相等。也可以不需要比较,就是不需要这个if,不进行元素的比较
if(((*(s+i))^(*(s+j)))==0)continue;
//这是其中一种交换方式,需要用到临时交换空间
// temp=*(s+i);
// *(s+i)=*(s+j);
// *(s+j)=temp;
//这是位运算方式进行交换,用了异或交换,相同为0,不同为1
*(s+i)^=*(s+j);
*(s+j)^=*(s+i);
*(s+i)^=*(s+j);
//另一种交换方式,也不需要临时存储空间
*(s+i)+=*(s+j);
*(s+j)=*(s+i)-*(s+j);
*(s+i)=*(s+i)-*(s+j);
}
}
5.总结
本题并不难。想到双指针是非常容易的。主要是两个元素进行交换时,方式很多。效率最高的是异或位运算进行交换。