💫最难的就是坚持,日复一日的坚持,哪怕只是一点点,也要坚持啊。
📆学习日期:2025年2月25日20:58:27
💻学习内容:替换数字
⏲️学习时长:1h
练习题目1
题目描述
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。
例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
对于输入字符串 "a5b",函数应该将其转换为 "anumberb"
输入:一个字符串 s,s 仅包含小写字母和数字字符。
输出:打印一个新的字符串,其中每个数字字符都被替换为了number
样例输入:a1b2c3
样例输出:anumberbnumbercnumber
数据范围:1 <= s.length < 10000。
解题思路
- 整体思路&&注意事项
- 首先扩充数组到每个数字字符替换成 "number" 之后的大小。
例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。
如图:
先遍历一次数组,统计数字字符的个数?
- 从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。
- 代码实现
#include<iostream>
using namespace std;
int main(){
string s;
while(cin>>s){//输入字符串
int s_old=s.size()-1;//旧字符串的尾部
//统计数字的个数
int count=0;
for(int i=0;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9') {
count++;
}
}
//扩充字符串的容量
s.resize(s.size()+count*5);//number为6位,但数字会被覆盖,因此增加5位即可
int s_new=s.size()-1;//新数组的尾部
//从后往前将数字替换为number
while(s_old>=0){
if(s[s_old]>='0'&&s[s_old]<='9'){
s[s_new--]='r';//从后往前填充
s[s_new--]='e';
s[s_new--]='b';
s[s_new--]='m';
s[s_new--]='u';
s[s_new--]='n';
}
else {
s[s_new]=s[s_old];
s_new--;//合并写法:s[s_new--]=s[s_old];
}
s_old--;
}
cout<<s<<endl;
}
}
Bug
while(cin>>s)
{
函数都在这里面,而不是只包含到统计字符串
对标准输入输出的写法还是不够熟悉
}
学习总结
- 标准输入输出 待学习
- 字符串可以改变大小
s.resize(s.size()+count*5);
字符串|string - 数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
这么做有两个好处:
-
- 不用申请新数组。
- 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
相关题目
双指针相关的题目分别是: