要求:给定一个字符串,反转串中的每个单词的字母顺序,但每个单词的顺序保持不变。
C语言实现:
char * reverseWords(char * s){
int length=strlen(s); //获取字符串的长度
int i=0; //计数器
while(i<length){ //循环到字符串末位
int start=i; //标记当前单词的起始位置
while(i<length&&s[i]!=' '){ //循环到当前单词的末位
i++;
}
int right=i-1; //存储当前单词的末位标号
for(int left=start;left<right;left++){ //反转单个单词
s[left]^=s[right];
s[right]^=s[left];
s[left]^=s[right];
right--;
}
while(i<length&&s[i]==' '){ //跳过字符串中的空格位
i++;
}
}
return s;
}
运行结果:
要求:原地反转输入字符串,在空间复杂度为O(1)的前提下解决问题。
java:
法一:
class Solution {
public void reverseString(char[] s) {
int len=s.length,size=len; //获取字符串的长度
for(int i=0;i<len/2;i++){ //前半段和后半段互换的循环条件
size--; //size先左移一位,因为数组的标号从0开始
char tmp=s[i]; //借助第三变量暂时存储数组的值
s[i]=s[size]; //将后段字符存储到前段位置
s[size]=tmp; //位置互换完成
}
}
}
法二:位运算(异或)
异或运算:
a=a^b;
b=a^b;
a=a^b;
一个变量异或本身恒等于0:a^a=0;
一个变量异或0恒等于本身:a^0=a;
同时,满足交互律和分配律,用该方式省去了O(1)的空间开销,代码实现如下:
class Solution {
public void reverseString(char[] s) {
int len = s.length,j=len;
for (int i = 0; i < len / 2; ++i) {
j--;
s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];
}
}
}