【卡码网54 替换字符串中的数字】代码详解

题目

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

思路

①获取字符串
②获取字符串中数字个数
③定义一个新的字符串,长度由原字符串与第二步所得到的数字个数有关
(处理方法二:改变原字符串长度,在元字符串上原地操作,本题采用方 法二)
④根据要求替换数字
⑤输出结果

代码

#include<iostream>
using namespace std;
int main()
{
    string s;
    int count=0;
    cin>>s;
    int size=s.size();
    for(int i=0;i<size;i++)
    {
        if(s[i]>='0'&&s[i]<='9')
        {
            count++;
        }
    }
    //std::cout << count << std::endl;
    s.resize(s.size()+count*5);
    //cout << s.size() << endl;
    int newSize=s.size();
    char number[]={'r','e','b','m','u','n'};
    for(int i=size-1;i>=0;i--)
    {
        //cout<< s[i] <<endl;
        newSize--;
        if(s[i]>='0'&&s[i]<='9')
        {
            for(int t=0;t<6;t++)
            {
                s[newSize-t]=number[t];
            }
            newSize=newSize-5;
        }
        else
        {
            s[newSize]=s[i];
        }
    }
    cout<< s <<endl;
    return 0;
}

代码整体描述

因为需要写整体的代码,包括头文件主函数等,而不是只写一个方法接口,所以一些细节需要遵守判题机制,这些在代码详解里就不过多赘述,如:引入头文件,主函数返回值等。

代码详解

    string s;
    int count=0;
    cin>>s;
    int size=s.size();

定义字符串s用于接收输入;count用于统计s中数字个数;cin>>s接收输入
size存放原始输入s的字符串大小。

    for(int i=0;i<size;i++)
    {
        if(s[i]>='0'&&s[i]<='9')
        {
            count++;
        }
    }

统计数字个数。

	s.resize(s.size()+count*5);
    int newSize=s.size();
    char number[]={'r','e','b','m','u','n'};

resize函数可以改变原来字符串的长度,后面的表达式为原来长度加上需要扩长的长度,需要注意的是count是乘以5而不是乘以替换字符串的长度6,这是因为在原来的字符串中已经占用了一个数字,每次替换只增长5个字符。
newSize变量用于存储变长后的字符串长度。
number变量存放需要替换的字符串,眼尖的码友应该发现了 我这里number存放的不是“number”字符串 而是“number”的反转,这是因为我们采用尾更新的方式进行修改原字符串,反转一下方便取值,码友们也可以顺序存放,只不过取值的时候注意一下就行。

    for(int i=size-1;i>=0;i--)
    {
        //cout<< s[i] <<endl;
        newSize--;
        if(s[i]>='0'&&s[i]<='9')
        {
            for(int t=0;t<6;t++)
            {
                s[newSize-t]=number[t];
            }
            newSize=newSize-5;
        }
        else
        {
            s[newSize]=s[i];
        }
    }
    cout<< s <<endl;

这里就是尾插法的实现过程,说明一下如果采用前插,原始数据会被覆盖,导致代码bug。
实现过程:我们保存了原始数据的字符串长度size,从这入手,如果不是数组就插入到新字符串规模下的队尾,如果是数字,就逐一插入number数组里的值,因为我们事先反转了number,所以顺着取就行,插入的同时记得改变指向插入位置的变量就行(我这里没有定义新的变量来指向插入的位置,直接用newSize变量来用,因为后面也用不到,而且字符串长度也可以获取)。
最后输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值