Leetcode算法入门第四天(双指针(3))

344. 反转字符串

题目描述

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

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

样例

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

思路

简单运用双指针的思路,每次都是左右两端节点进行交换,直到左右端点重合,字符串的反转就完成了。

参考代码

class Solution {
public:
    void reverseString(vector<char>& s) {
        //双指针:每次都是头尾交换
        //初始化左指针为0,右指针为数组长度减一
        int left=0;
        int right=s.size()-1;
        while(left<right)
        {
            //交换左右指针所在元素
            char temp=s[left];
            s[left]=s[right];
            s[right]=temp;
            //移动指针
            left++;
            right--;
        }
    }
};

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

题目描述

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

s 包含可打印的 ASCII 字符。
s 不包含任何开头或结尾空格。
s 里 至少 有一个词。
s 中的所有单词都用一个空格隔开。

样例

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

思路

这道题本质和前一道题思路一致,就是进行单词的反转,这里只是增加了根据空格判断出一个字符串中的单词,对每个单词进行反转:通过遍历整个字符串,遇到空格,就对前面的单词进行反转,需要一个left存储该单词的起点下标,即每个单词区间都是【left,i-1】进行反转。值得注意的是最后一个单词因为结尾没有出现空格,所以要单独进行反转。

参考代码

class Solution {
public:
    //反转一个单词
    void reverse(string &s,int left,int right)
    {
        while(left<right)
        {
            swap(s[left],s[right]);
            left++;
            right--;
        }
    }
    string reverseWords(string s) {
        int n=s.size();
        int left=0;

        //以空格分割每个单词
        for(int i=0;i<n;i++)
        {
            //找到空格
            if(s[i]==' ')
            {
                reverse(s,left,i-1);
                //当前空格不算:下个单词左端点
                left=i+1;
            }   
        }
        //最后一个单词没变:
        reverse(s,left,n-1);
        return s;
    }
};

最后的话;这几天双指针的题确实有点easy,慢慢来吧,先甜后苦嘛,fighting!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值