算法第七天|反转字符串LeetCode344、反转字符串ⅡLeetCode541、替换数字LeetCode54

今日问题:整体简单,有许多操作可以直接使用库函数来解决,但是在算法阶段,尽量学会其他的简便方法。

反转字符串

题目链接:LeetCode344、反转字符串

整体思路 :

思路一 :

        反转一个字符串,直接使用reverse库函数就行,这个函数在库#include <algorithm>

class Solution {
public:
    void reverseString(vector<char>& s) {
        reverse(s.begin(),s.end());
    }
};

思路二:

        使用循环swap

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

反转字符串Ⅱ

题目链接:LeetCode541、反转字符串Ⅱ

整体思路:

        使用一个for循环,遍历整个字符串,每次增加2k;

        在循环中首先判断当前位置+k是不是超过了字符长度,超过了就反转到end,没超过就反转到i+k的位置

class Solution {
public:
    string reverseStr(string s, int k) {
        int i =0;
        for(i;i<s.size();i=i+2*k)
        {
            if(i+k>s.size())
                reverse(s.begin()+i,s.end());
            else
            {
                reverse(s.begin()+i,s.begin()+i+k);
            }

        }
        return s;
    }
};

替换数字

题目链接:KamaCoder54、替换数字

整体思路:

思路一:

        直接使用一个额外数组

#include <iostream>
// #include <bits/stdc++.h>
#include <cstdio>

using namespace std;

int main()
{
    string s ,res;
    cin >>s;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]>='a'&&s[i]<='z')//说明是字符
        {
            res +=s[i];
        }
        else
        {
            res +="number";
        }
    }
    printf("%s",res.c_str());
    // cout <<res<<endl;
    return 0;
}

思路二:

        不使用额外数组:

                1、如果不使用额外的数组,首先确定的是要将字符串的尺寸resize为多大?

                2、所以需要遍历字符串,查询有多少个数字,之后计算resize的尺寸

                3、从后往前,将字符直接复制到后边,遇到数字从后往前替换成“number”

 

//不使用额外的空间
//需要在字符串后边添加空间:数字个数*(number-1)的空间
//通过将小写字母移动到最后,遇到数字就从后往前补number

#include <iostream>

using namespace std;

int main()
{
    string s;
    cin>>s;

    //遍历字符串,统计数字的数量
    int nums=0;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]>='0'&&s[i]<='9')  nums++;
    }
    //记录旧空间的尺寸,作为一个指针的起始位置
    int i = s.size()-1;

    //对字符串开辟新空间
    s.resize(s.size()+(6-1)*nums);

    //从后往前遍历整个新的字符串
    for(int j = s.size()-1;j>=0&&i>=0;j--)
    {
        if(s[i]>='a'&&s[i]<='z')//是字符
        {
            s[j]=s[i];
            i--;
        }
            
        else
        {
            i--;
            s[j--]='r';
            s[j--]='e';
            s[j--]='b';
            s[j--]='m';
            s[j--]='u';
            s[j]='n';

        }
    }
    cout <<s<<endl;
    //
    return 0;
}

                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值