代码随想录算法 Day8 | Ch4 字符串(一)● 344.反转字符串● 541. 反转字符串II ●卡码网54. 替换数字

一、反转字符串

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

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

        2.思路:双指针分别从字符串首尾往中间靠拢即可

        3.注意:在函数 swapchar(char &a, char &b) 的形参里一定要加 &,没有&时只是交换局部变量 a 和 b。

        4.代码:

class Solution {
public:
    void swapchar(char &a, char &b)
    {
        char tmp;
        tmp = a;
        a = b;
        b = tmp;
    }

    void reverseString(vector<char>& s) {
        int left = 0;
        int right = s.size()-1;

        while(left<right)
        {
            swapchar(s[left], s[right]);
            left++;
            right--;
        }
    }
};

二、反转字符串II

        1.题目:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

        2.思路:三指针,分别标记0,k,2k的位置,对k,2k是否超出字符串长度判断。

        3.注意:

        4.代码:

class Solution {
public:
    void swapchar(char &a, char &b)
    {
        char tmp;
        tmp = a;
        a = b;
        b = tmp;
    }
    
    string reverseStr(string s, int k) {
        int left = 0;
        int right = k-1;
        int pre = k * 2 - 1;
        int tmpLeft,tmpRight;

        while( pre < s.size()-1 )
        {
            tmpLeft = left;
            tmpRight = right;
            while(tmpLeft<tmpRight)
            {
                swapchar(s[tmpLeft], s[tmpRight]);
                tmpLeft++;
                tmpRight--;
            }
            
            left += 2*k;
            right += 2*k;
            pre += 2*k;
        }

        if( right>s.size()-1 )
        {
            tmpLeft = left;
            tmpRight = s.size() - 1;
            while(tmpLeft<tmpRight)
            {
                swapchar(s[tmpLeft], s[tmpRight]);
                tmpLeft++;
                tmpRight--;
            }

        }else{
            tmpLeft = left;
            tmpRight = right;
            while(tmpLeft<tmpRight)
            {
                swapchar(s[tmpLeft], s[tmpRight]);
                tmpLeft++;
                tmpRight--;
            }
        }

        return s;

    }
};

三、卡码网54. 替换数字

        1.题目:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

        2.思路:双指针

        3.注意:

        (1)替换之前先扩大字符串的size。当从前往后替换时,遇到数字后必定会覆盖原有后续元素,此时为保留原有数据只能使用新的空间,所以在本题中使用从后往前替换覆盖。

        (2)熟悉笔试答题方式

        4.代码:

#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    string s;
    int numCnt = 0;
    
    while( cin >> s)
    {
        
        for(int i=0; i<s.size(); i++)
        {
            if( s[i] < 'a' || s[i] > 'z')
                numCnt++;
        }
        
        // 扩充数组长度
        int s_oldIndex = s.size() - 1;
        s.resize(s.size() + numCnt * 5);
        int s_newIndex = s.size() - 1; 
        
        // 从后往前填充
        while( s_oldIndex >= 0)
        {
            if( s[s_oldIndex] > '0' && s[s_oldIndex] < '9')
            {
                s[s_newIndex--] = 'r';
                s[s_newIndex--] = 'e';
                s[s_newIndex--] = 'b';
                s[s_newIndex--] = 'm';
                s[s_newIndex--] = 'u';
                s[s_newIndex--] = 'n';
            }else{
                s[s_newIndex--] = s[s_oldIndex];
            }
            
            s_oldIndex--;
        }
        
        cout << s << endl;
    }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值