替换数字
题目
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。
例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
对于输入字符串 "a5b",函数应该将其转换为 "anumberb"
输入:一个字符串 s,s 仅包含小写字母和数字字符。
输出:打印一个新的字符串,其中每个数字字符都被替换为了number
样例输入:a1b2c3
具体思路
- 输入时计算数组中存在的数字数量,
str[i] > "0" && str[i] < "9"
进行判断; - 记录输入的数量
size
,记录需要扩容的数量resize
; - 从后往前 就不用移动原来中的元素(因为目的是O(1)的空间复杂度) 进行扩容;
- 每查找到一个数字进行替换,否则正常复制。
具体代码
CPP
C++
#include <iostream>
using namespace std;
int main() {
string s;
cin >> s;
int count = 0;
// 统计数字字符的个数
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
count++;
}
}
int original_size = s.size(); // 保存原始字符串大小
s.resize(original_size + count * 5); // 扩展字符串以容纳 "number"
int k = s.size() - 1; // 新字符串末尾的位置
for (int j = original_size - 1; j >= 0; j--) {
if (s[j] >= '0' && s[j] <= '9') { // 判断是否为数字
s[k] = 'r';
s[k - 1] = 'e';
s[k - 2] = 'b';
s[k - 3] = 'm';
s[k - 4] = 'u';
s[k - 5] = 'n'; // 插入 "number"
k -= 6; // 减去 "number" 的长度
} else {
s[k] = s[j]; // 复制非数字字符
k--;
}
}
// 输出修改后的字符串
cout << s << endl;
return 0;
}
Java直接版本
java
import java.util.Scanner;
public class Main {
public static void main(String[] s) {
Scanner sc = new Scanner(System.in);
String cur = sc.nextLine();
StringBuilder sb = new StringBuilder();
int count = 0;
for (int i = 0; i < cur.length(); i++) {
if (cur.charAt(i) - '0' >= 0 && cur.charAt(i) - '0' <= 9) {
sb.append("number");
} else {
sb.append(cur.charAt(i));
}
}
System.out.println(sb.toString());
}
}