算法刷题记录 二十二【替换数字】

前言

字符串篇,继续。

记录 二十二【替换数字】(非力扣网题目)


一、题目阅读

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number

输入:一个字符串 s,s 仅包含小写字母和数字字符。

输出:打印一个新的字符串,其中每个数字字符都被替换为了number

示例一:

输入 :"a1b2c3";
输出: "anumberbnumbercnumber"。

示例二:

输入:"a5b"
输出: "anumberb"

示例三:

输入:"a189bc256"
输出:"anumbernumbernumberbcnumbernumbernumber"

提示:

数据范围:1 <= s.length < 10000。

二、尝试实现

(1)发现替换成number后,字符串长度发生变化,所以如果正向检查并替换,还得移动后面的字符,比较麻烦。

(2)所以想用一个新的string,重新填充,返回这个新string。

(3)判断是字母还是数字?

  • 注意:每个数字字符都替换成number,初始误以为数字替换成number。
  • 错误认为示例三:输入:"a189bc256";输出:"anumberbcnumber"。把189和256当成一个数字。而不是每个数字字符。

代码实现

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

string numberSwap(string s){
    int num = 0;
    string result;
    for(int i = 0;i < s.size();i++){
        if(s[i] - 'a' >= 0){    //判断这个位置是字母
            result.push_back(s[i]);
        }else{
            result.insert(result.size(),"number");
        }
    }
    return result;
    
}

int main(){
    
    string s;//获取输入的字符串
    cin>>s;
    
    string s_swap = numberSwap(s);
    
    cout<<s_swap;//输出转换过的字符串
    return 0;
    
}

总结:用额外的string数组空间来处理。如果想原地处理呢?


三、新思路学习

原地操作string,在原来的基础上操作string。(双指针法------针对数组。string也是字符数组。

(1)上面说"正向检查并替换,还得移动后面的字符,比较麻烦"。那就先扩容,找出string中所有的数字字符,先增加数组长度,能容纳替换成number之后的string。

(2)正向不行,倒着检查并移动替换。

  • 如果是字母,直接移动后面;
  • 如果是数字,后面指针向前覆盖填充number。

代码实现

按照新思路实现

cpp 复制代码
#include <string>
#include <iostream>
using namespace std;

void numberSwap(string& s){
    int size = s.size();
    int count = 0;//计数数字有几个
    for(int i = 0;i < size;i++){
        if(s[i] >= '0' && s[i] <='9'){
            count++;
        }
    }
    
    s.resize(size+count*5);//覆盖填充,所以原本的数字的位置也可以用
    //双指针开始
    for(int i = s.size()-1,j = size-1;j >= 0 ; i--,j--){   //i是新数组的末尾,j是原来数组的末尾
        if(s[j] >= '0' && s[j] <='9' ){ //数字
            s[i--] = 'r';	//先赋值再--
            s[i--] = 'e';
            s[i--] = 'b';
            s[i--] = 'm';
            s[i--] = 'u';
            s[i] = 'n';
        }else{  //字母
            s[i] = s[j];
        }
    }
    
}


int main(){
    string s;
    cin>>s;
    
    numberSwap(s);
    
    cout<<s;
    
    return 0;
}

总结

替换填充、覆盖操作。先扩容再倒着先前完成。

(欢迎指正,转载表明出处)

相关推荐
LCG元2 小时前
【面试问题】JIT 是什么?和 JVM 什么关系?
面试·职场和发展
唐诺4 小时前
几种广泛使用的 C++ 编译器
c++·编译器
XH华4 小时前
初识C语言之二维数组(下)
c语言·算法
南宫生5 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
不想当程序猿_5 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
落魄君子5 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
冷眼看人间恩怨5 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
菜鸡中的奋斗鸡→挣扎鸡5 小时前
滑动窗口 + 算法复习
数据结构·算法
红龙创客5 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin5 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin