六月集训 第五天——双指针

前言

今天算法的内容是:双指针

一、 反转单词前缀

        给你一个下标从 0 开始的字符串 word 和一个字符 ch 。找出 ch 第一次出现的下标 i ,反转 word 中从下标 0 开始、直到下标 i 结束(含下标 i )的那段字符。如果 word 中不存在字符 ch ,则无需进行任何操作。
例如,如果 word = “abcdefd” 且 ch = “d” ,那么你应该 反转 从下标 0 开始、直到下标 3 结束(含下标 3 )。结果字符串将会是 “dcbaefd” 。
返回 结果字符串 。

一、思路:

        双指针(1) for循环下定义一个指针进行移动,若遇见 ch,进行从 i 到 j 间字符调换,然后结束循环;
        (2)找不到ch就也结束循环;

二、源码

class Solution {
public:
    string reversePrefix(string word, char ch) {
        for(int i=0;i<word.size();i++){
            int j=i;
            while(j<word.size()&&word[j]!=ch) j++;
            if(word[j]==ch){
                while(i<j){
                    int t=word[i];
                    word[i]=word[j];
                    word[j]=t;
                    ++i,--j;
                }
            }
            break;
        }
        return  word;
    }
};

三.知识点

        双指针的应用,数组内元素的相互调换

二、 仅仅反转字母

        给你一个字符串 s ,根据下述规则反转字符串:
所有非英文字母保留在原有位置。
所有英文字母(小写或大写)位置反转。
返回反转后的 s 。

一、思路:

        定义两个指针,从左向右移动若不为 字母移动动 ,从右向左扫描;若不为字母 移动,然后进行 前后调换,循环直到指针相撞;

二、源码

class Solution {
    bool isWord(char a){
        return a>='a'&&a<='z'||a>='A'&&a<='Z';
    }
    void swap(char *a,char *b){
        char t=*a;
        *a=*b;
        *b=t;
    }
public:
    string reverseOnlyLetters(string s) {
        int i=0,j=s.size()-1;
        while(i<j){
            if(!isWord(s[i])) {
                ++i;
                continue;
            }
            if(!isWord(s[j])) {
                --j;
                continue;
            }
            swap(&s[i],&s[j]);
            ++i,--j;
        }
        return s;
    }
};

三.知识点

        双指针的应用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值