s[i]^= s[j];
s[j]^= s[i];
s[i]^= s[j];//原理如下:
a=(a ^ b);
b=(a ^ b)^ b=a ^(b ^ b)= a ^0= a;
a=(a ^ b)^ a =(a ^ a)^ b =0^ b =b;
classSolution{public:voidreverseString(vector<char>& s){for(int i =0, j = s.size()-1; i < s.size()/2; i++, j--){swap(s[i],s[j]);}}};
541. 反转字符串II
题目链接:541. 反转字符串 II - 力扣(LeetCode)
讲解链接:代码随想录 (programmercarl.com)
状态:两次AC。
思路与重点
其实在遍历字符串的过程中,只要让** i += (2 * k)**,i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。因为要找的也就是每2 * k 区间的起点,这样写,程序会高效很多。所以当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。
classSolution{public:string reverseStr(string s,int k){for(int i =0; i < s.size(); i +=(2* k)){// 1. 每隔 2k 个字符的前 k 个字符进行反转// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符if(i + k <= s.size()){reverse(s.begin()+ i, s.begin()+ i + k );}else{// 3. 剩余字符少于 k 个,则将剩余字符全部反转。reverse(s.begin()+ i, s.end());}}return s;}};