【字符串算法题记录】54. 替换数字——双指针

本文介绍了一种优化方法,通过双指针从后处理字符串,将数字字符高效转换为number,避免了遍历过程中频繁移动字符,提高了算法效率。给出了C++代码示例。
摘要由CSDN通过智能技术生成

题目链接

思考

其实这题不难,主要考察的是算法的效率。

  • 辅助空间的使用。因为要将字符'数字'变为"number",则字符串s的大小一定会变长,那么我们可以首先计算出s中的数字字符个数,然后将它扩充到我们需要的大小,再进行变换。
  • 字符变换。最简单直接的方法是从头往后遍历,碰到字符是数字的,就对它进行变换。但是这里会让时间复杂度变得非常高,因为我们每次变换,都要将后面的字符往后移。所以我们在这里考虑从后处理的方式:双指针i和j,分别一个指向原来字符串的末尾,一个指向新的字符串末尾,我们要做的就是依次将旧字符串中的字符,移到新字符串中对应的位置,其中如果碰到了数字字符,则要把它换为"number"再放到后面去,这样我们每次就只是对一个字符进行处理,不影响其他字符,效率自然就更高一些。

cpp代码

#include <iostream>

using namespace std;
int main(){
    string s;
    while (cin >> s){
        int count = 0; // 数字计数器
        string number = {'n', 'u', 'm', 'b', 'e', 'r'};
        int sOldSize = s.size();
        for(int i = 0; i < sOldSize; i++){
            if(s[i] >= '0' && s[i] <= '9')
                count++;
        }
        int sNewSize = sOldSize + count * 5; // 计算数字变换成"number"后s的大小
        s.resize(sNewSize);
        
        for(int i = sOldSize-1, j = sNewSize-1; i >= 0; i--, j--){ //从后向前处理每一位字符
            if(s[i] < '0' || s[i] > '9') s[j] = s[i];
			else{
				for(int k = 5; k >= 0; k--, j--){
					s[j] = number[k];
				}
				j++; 
			}
        }
        
        cout << s << endl;
    }
}
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值