广州建站模板,PC端网站开发以及设计费用,ui设计包括哪些场景,社交网站做强题目 给定一个字符串 s#xff0c;它包含小写字母和数字字符#xff0c;请编写一个函数#xff0c;将字符串中的字母字符保持不变#xff0c;而将每个数字字符替换为number。
例如#xff0c;对于输入字符串 a1b2c3#xff0c;函数应该将其转换为 anu…题目 给定一个字符串 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)的算法了因为每次添加元素都要将添加元素之后的所有元素整体向后移动。
其实很多数组填充类的问题其做法都是先预先给数组扩容带填充后的大小然后在从后向前进行操作。重点就是从后向前
这么做有两个好处 不用申请新数组。从后向前填充元素避免了从前向后填充元素时每次添加元素都要将添加元素之后的所有元素向后移动的问题。 C代码如下
#includeiostream
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();// 从后先前将空格替换为numberfor (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、vectorchar和(const)char *之间的转换_vectorchar和string-CSDN博客