344. 反转字符串

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

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

示例 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"]


 注:使用双指针,定义一个头指针left,一个尾指针right,然后分别交换头尾指针。

class Solution {
public:
    void reverseString(vector<char>& s) {
        int n = s.size(),k=0;
        vector<char> a;
        int left=0,right=n-1;
        while(left<right){
            k=s[left];
            s[left]=s[right];
            s[right]=k;
            left++;
            right--;
        }
    }
};

 

557. 反转字符串中的单词 III

给定一个字符串 s ,反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 1:


输入:s = "Let's take LeetCode contest" 输出:"s'teL ekat edoCteeL tsetnoc"


示例 2:


输入: s = "God Ding" 输出:"doG gniD"


提示:

  • 1 <= s.length <= 5 * 104
  • s 包含可打印的 ASCII 字符。
  • s 不包含任何开头或结尾空格。
  • s 里 至少 有一个词。
  • s 中的所有单词都用一个空格隔开。

 注:本题使用双指针的形式,通过空格的位置和字符长度来判断翻转字符串的位置,一层for循环后找到每一个位置后,然后用一个while循环分别对每一个位置进行反转操作。在while循环中,通过交换收尾元素指针来进行元素交换。

class Solution {
public:
    string reverseWords(string s) {
        int n = s.size(), j = 0, n1 = 0;
        char temp;
        for(int i = 0;i <= n;i++){
            if(s[i] == ' '|| i == n){
                n1 = i-1;//记录空格的位置
                while(j < n1){
                    temp = s[j];
                    s[j] = s[n1];
                    s[n1] = temp;
                    j++;
                    n1--;//字符交换
                }
                j = i + 1;//跳到下一个空格后单词
            }
        }
        return s;
    }
};

通过以上的练习,对双指针的形式有了更进一步的了解,明天见~