简介

在看Leetcode中专项突破的数组和字符串专题中,看完其中双指针技巧 —— 情景一,进行题目练习,

双指针的技巧情景一

我们通过迭代数组来解决一些问题。通常,我们只需要一个指针进行迭代,即从数组中的第一个元素开始,最后一个元素结束。然而,有时我们会使用两个指针进行迭代。

图片说明

示例:

让我们从一个经典问题开始:

反转数组中的元素。比如数组为 ['l', 'e', 'e', 't', 'c', 'o', 'd', 'e'],反转之后变为 ['e', 'd', 'o', 'c', 't', 'e', 'e', 'l']。

使用双指针技巧,其思想是分别将两个指针分别指向数组的开头及末尾,然后将其指向的元素进行交换,再将指针向中间移动一步,继续交换,直到这两个指针相遇。

图片说明

这个技巧太好了,简直就是针对字符串翻转的,根本不需要找什么规律。

题目

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

case 1:

输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]

case 2 :

输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

思考过程

#include<iostream>
#include<vector>

using namespace std;

class Solution {
    public:
        void reverseString(vector<char> &s){
            int i = 0, j = s.size()-1;
            char tmp;
            // while(i != j){ --> bug
            while(i < j)
                if(s[i] != s[j]){
                    tmp = s[i];
                    s[i] = s[j];
                    s[j] = tmp;
                }
                i++;
                j--;
            }
        }
};

int main(){
    vector<char> str = {'a','b','d','e'};
    Solution test_case;
    test_case.reverseString(str);
    for(char ch : str)
        cout << "str :" << ch << endl;
    return 0;
}

基本原理就是定义两个指针,一个指向头,一个指向尾,字符不等的时候进行两两交换,当i != j 的时候,退出循环,但是这个条件是有问题的,如果字符个数刚好是5个时候,循环到2的时候,刚好退出,如果字符的个数是4个时候,条件一直成立,数组索引越界,产生崩溃,所以条件需要改为i < j 才正常