• 344.反转字符串 :::info 如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。
      不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 ::: 代码:(详细注释)
      反转字符串 - 图1
      1. void reverseString(vector<char>& s) {
      2. for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) {
      3. swap(s[i],s[j]);
      4. }
      5. }
      分析:
      swap可以有两种实现。

    一种就是常见的交换数值:

    1. int tmp = s[i];
    2. s[i] = s[j];
    3. s[j] = tmp;

    一种就是通过位运算:

    1. s[i] ^= s[j];
    2. s[j] ^= s[i];
    3. s[i] ^= s[j];

    解释一下这里
    关键:

    • 两个相同的数异或的结果是 0,
    • 一个数和 0 异或的结果是它本身
    • 异或运算支持运算的交换律和结合律

    所以:
    反转字符串 - 图2反转字符串 - 图3
    要让反转字符串 - 图4 (swap)
    根据黄色可知
    反转字符串 - 图5

    更多关于位运算
    https://zhuanlan.zhihu.com/p/65968533
    https://www.runoob.com/w3cnote/bit-operation.html

    • 541.反转字符串Ⅱ :::info 模拟题
      当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。 ::: 代码:(详细注释)
      1. class Solution {
      2. public:
      3. string reverseStr(string s, int k) {
      4. for (int i = 0; i < s.size(); i += (2 * k)) {
      5. // 1. 每隔 2k 个字符的前 k 个字符进行反转
      6. // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
      7. if (i + k <= s.size()) {
      8. reverse(s.begin() + i, s.begin() + i + k );
      9. continue;
      10. }
      11. // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
      12. reverse(s.begin() + i, s.begin() + s.size());
      13. }
      14. return s;
      15. }
      16. };
      :::info 注意这里的迭代器区间是默认的左闭右开、
      体会reverse(s.begin() + i, s.begin() + i + k ); 刚好取到了[i,i+k)下标的元素,也就是从i数k个元素。 :::

    分析:
    实现reverse函数区间是左闭右闭区间

    1. class Solution {
    2. public:
    3. void reverse(string& s, int start, int end) {
    4. for (int i = start, j = end; i < j; i++, j--) {
    5. swap(s[i], s[j]);
    6. }
    7. }
    8. string reverseStr(string s, int k) {
    9. for (int i = 0; i < s.size(); i += (2 * k)) {
    10. // 1. 每隔 2k 个字符的前 k 个字符进行反转
    11. // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
    12. if (i + k <= s.size()) {
    13. reverse(s, i, i + k - 1);
    14. continue;
    15. }
    16. // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
    17. reverse(s, i, s.size() - 1);
    18. }
    19. return s;
    20. }
    21. };