代码随想录阅读笔记-字符串【替换数字】

题目

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

例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

对于输入字符串 "a5b",函数应该将其转换为 "anumberb"

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

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

样例输入:a1b2c3

样例输出:anumberbnumbercnumber

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

思路 

从题意上看这道题算是字符串中的基础题,如果想把这道题目做到极致,就要做到不分配多余的空间,也就是在原数组基础上只增加多出的那些字符串空间(针对c++语言)下面将原文中作者的思路图示展示如下,思路非常清晰,方法效率也非常高。

首先扩充数组到每个数字字符替换成 "number" 之后的大小。

例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。

如图:

然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。

有同学问了,为什么要从后向前填充,从前向后填充不行么?

从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素整体向后移动。

其实很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。(重点就是从后向前)

这么做有两个好处:

  1. 不用申请新数组。
  2. 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。

C++代码如下:

#include<iostream>
using namespace std;
int main() {string s;while (cin >> s) {int count = 0; // 统计数字的个数int sOldSize = s.size();for (int i = 0; i < s.size(); i++) {if (s[i] >= '0' && s[i] <= '9') {count++;}}// 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小s.resize(s.size() + count * 5);int sNewSize = s.size();// 从后先前将空格替换为"number"for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {if (s[j] > '9' || s[j] < '0') {s[i] = s[j];} else {s[i] = 'r';s[i - 1] = 'e';s[i - 2] = 'b';s[i - 3] = 'm';s[i - 4] = 'u';s[i - 5] = 'n';i -= 5;}}cout << s << endl;}
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

注意点

这里也给大家拓展一下字符串和数组有什么差别,

字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说C/C++中的字符串。

在C语言中,把一个字符串存入一个数组时,也把结束符 '\0'存入数组,并以此作为该字符串是否结束的标志。

例如这段代码:

char a[5] = "asd";
for (int i = 0; a[i] != '\0'; i++) {
}

在C++中,提供一个string类,string类会提供 size接口,可以用来判断string类字符串是否结束,就不用'\0'来判断是否结束。

例如这段代码:

string a = "asd";
for (int i = 0; i < a.size(); i++) {
}

那么vector< char > 和 string 又有什么区别呢?

其实在基本操作上没有区别,但是 string提供更多的字符串处理的相关接口,例如string 重载了+,而vector却没有。至于更多的区别和相互的转化,大家可以参看C++ string、vector<char>和(const)char *之间的转换_vector<char>和string-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/752895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PlayBook 详解

4&#xff09;Playbook 4.1&#xff09;Playbook 介绍 PlayBook 与 ad-hoc 相比&#xff0c;是一种完全不同的运用 Ansible 的方式&#xff0c;类似与 Saltstack 的 state 状态文件。ad-hoc 无法持久使用&#xff0c;PlayBook 可以持久使用。 PlayBook 剧本是 由一个或多个 “…

使用Docker搭建Nascab

使用Docker来部署Nascab能够让这个过程变得更加灵活和便捷&#xff0c;因为Docker可以在隔离的环境中运行应用程序&#xff0c;简化了部署和配置的复杂性。 使用Docker CLI部署Nascab docker run -d \ --name nascab \ -p 18080:80 \ -p 18443:443 \ -p 18090:90 \ -p 18021:…

Linux之shell变量

华子目录 什么是变量&#xff1f;变量的名称示例 变量的类型变量的定义示例 自定义变量查看变量&#xff08;自定义变量和全局变量&#xff09; 环境变量定义环境变量&#xff08;全局变量&#xff09;法一法二法三env&#xff0c;printenv&#xff0c;export注意 C语言与shell…

upload-labs 0.1 靶机详解

下载地址https://github.com/c0ny1/upload-labs/releases Pass-01 他让我们上传一张图片&#xff0c;我们先尝试上传一个php文件 发现他只允许上传图片格式的文件&#xff0c;我们来看看源码 我们可以看到它使用js来限制我们可以上传的内容 但是我们的浏览器是可以关闭js功能的…

蓝桥杯-粘木棍-DFS

题目 思路 --有n根木棍&#xff0c;需要将其粘成m根木棍&#xff0c;并求出最小差值&#xff0c;可以用DFS枚举出所有情况。粘之前有n根短木棍&#xff0c;粘之后有m根长木棍&#xff0c;那么让长木棍的初始长度设为0。外循环让所有的短木棍都参与粘&#xff0c;内循环让要粘的…

windows 11访问Debian10上的共享目录

步骤 要在Windows 11上访问Debian 10.0.0的共享目录&#xff0c;可以通过以下步骤来实现&#xff1a; 1. 设置Samba服务&#xff1a;在Debian系统上&#xff0c;需要安装并配置Samba服务&#xff0c;以便能够实现文件夹共享。Samba是一个允许Linux/Unix服务器与Windows操作系…

threejs 实现鼠标大面积选取场景内3d模型,SelectionBox API 案例使用

SelectionBox API 案例使用 这个函数创建了一个 3D 场景&#xff0c;包括一个相机、光源、多个立方体以及一个 WebGL 渲染器&#xff0c;并在页面上渲染这个场景 function init() {// 创建一个容器 div 元素并将其添加到页面的 body 中container document.createElement(div)…

php反序列化及其常见魔术方法及其触发条件

反序列化介绍&#xff1a; PHP对象反序列化操作是指将一个之前通过serialize()函数转换为字符串表示的PHP对象数据&#xff0c;还原成原始PHP对象结构的过程。当需要从存储&#xff08;如数据库、文件或网络传输&#xff09;中恢复对象状态时&#xff0c;会使用unserialize()函…

【爬虫】User-Agent反爬虫

指服务器端通过校验usr-agent 来区分正常用户和爬虫程序的手段&#xff0c;是较为初级的爬虫。 一般是在做请求的 header 中。 user-agent 记录了请求的设备信息&#xff0c;如果在请求的时候没带 user-agent 可以视为爬虫故意请求&#xff0c;对这样的请求服务器可以拦截。 使…

C# Array(进阶)_Lambda表达式_冒泡排序_集合

文章目录 数组操作与高阶方法Lambda表达式Lambda表达式在C#中的应用及练习 数组排序&#xff1a;深入理解冒泡排序与选择排序冒泡排序原理 选择排序原理 选择排序和冒泡排序的区别 C#排序&#xff1a;掌握Sort()方法的使用集合类型全览&#xff1a;C#集合的使用详解C# 中的集合…

2024年阿里云数据库价格_云数据库收费标准最新

2024年阿里云数据库价格查询&#xff0c;云数据库优惠活动MySQL版2核2GB 50GB配置99元一年&#xff0c;续费不涨价&#xff0c;续费也是99元1年&#xff0c;云数据库MySQL基础系列经济版 2核4GB 100GB配置227元1年&#xff0c;RDS SQL Server云数据库2核4G配置299元1年&#xf…

【CSS】Vue2使用TailwindCSS方法及相关问题

一.安装 1.npm安装TailwindCSS npm install tailwindcssnpm:tailwindcss/postcss7-compat tailwindcss/postcss7-compat postcss^7 autoprefixer^9 2.创建配置文件 npx tailwindcss init 3.创建postcss.config.js文件 // postcss.config.js module.exports {plugins: {t…

pymysql中怎么在插入的数据改成变量值

我这个是用pymysql数据库来写 mport pymysql # 连接到数据库 conn pymysql.connect(hostlocalhost, userusername, passwordpassword, dbdatabase_name) # 创建一个游标对象 cursor conn.cursor() # 准备插入语句 s1"""INSERT INTO 库名.表名 ( 这是表…

git的下载与安装

下载 首先&#xff0c;打开您的浏览器&#xff0c;并输入Git的官方网站地址 点击图标进行下载 下载页面会列出不同操作系统和平台的Git安装包。根据您的操作系统&#xff08;Windows、macOS、Linux等&#xff09;和位数&#xff08;32位或64位&#xff09;&#xff0c;选择适…

阿里云关系型数据库RDS概述

阿里云关系型数据库服务&#xff08;ApsaraDB RDS&#xff0c;Relational Database Service&#xff09;是阿里巴巴集团提供的云端托管式关系型数据库产品&#xff0c;旨在帮助企业与开发者在无需自建和维护底层基础设施的情况下&#xff0c;轻松部署、管理和扩展关系型数据库。…

Android学习深入

性能优化 学习识别和解决常见的性能问题&#xff0c;如内存泄漏、布局优化等 Android性能优化是确保应用流畅运行、提升用户体验的关键。以下是关于如何识别和解决一些常见性能问题的指导&#xff0c;包括内存泄漏、布局优化等。 1. 内存泄漏 内存泄漏发生时&#xff0c;已…

Boost Graph Library中VF2(子图同构)算法的使用

Boost Graph Library&#xff0c;简称BGL&#xff0c;库中有各种各样经典的Graph算法&#xff0c;这里介绍其中的VF2算法——vf2_subgraph_iso。 数据怎么存 在BGL中&#xff0c;图是用adjacency_list类型数据存储&#xff0c;也就是邻接列表&#xff0c;里面可以存顶点信息&…

【C语言】数据结构和流程控制语句

C语言是一种广泛应用于系统编程和应用软件开发的高级编程语言。它提供了丰富的数据结构和流程控制语句&#xff0c;使程序员能够更有效地组织数据和控制程序的执行流程。本文将介绍C语言中常用的数据结构和流程控制语句&#xff0c;以帮助读者更好地理解和使用C语言。 1. 数据…

vue使用element-ui 实现自定义分页

可以通过插槽实现自定义的分页。在layout里面进行配置。 全部代码 export default { name:Cuspage, props:{total:Number, }, data(){return {currentPage:1,pageSize:10,} } methods: {setslot (h) {return(<div class"cusPage"›<span on-click{this.toBe…

E4-R升级固件方法 RockChip 3562

芯片&#xff1a;RockChip 3562 开发板 先安装驱动&#xff1a;DriverAssitant_v5.1.1 下载工具&#xff1a;RKDevTool_v3.13_for_window 烧录完整的update.img固件 1.选择update.img 2.关机下&#xff0c;同时Update和Power进入maskrom模式。界面会显示设备 3.点击升级 …