题目链接
题目描述
根据题意,给定一个只包含数字的非空字符串,你需要将其中所有的字符 5
替换为符号 *
,并输出替换后的结果。
输入描述:
- 在一行输入一个只包含数字的非空字符串,长度不超过 1000。
输出描述:
- 输出一个字符串,为将所有字符
5
替换为*
后的结果。
示例1:
- 输入:
114514
- 输出:
114*14
- 说明: 输入中的字符
5
被替换为了*
。
解题思路
这是一个典型的字符串替换问题,解法非常直接。主要有两种思路:
思路一:遍历字符 (基础方法)
这是最基本、最通用的方法,不依赖于特定的高级函数。
- 读取输入: 读取完整的字符串。
- 遍历: 使用一个循环,逐一检查输入字符串中的每一个字符。
- 判断与替换: 在循环中,判断当前字符是否为
'5'
。- 如果是,则在新的结果字符串中添加
'*'
。 - 如果不是,则将原字符添加到结果字符串中。
- 如果是,则在新的结果字符串中添加
- 输出: 循环结束后,打印构建好的新字符串。
在 C++ 中,由于 std::string
是可变的,可以直接在原字符串上进行修改,从而节省空间。
思路二:使用内置替换函数 (推荐)
大多数现代编程语言都提供了内置的字符串替换函数,这是解决此类问题的首选方法,因为它代码简洁、可读性高且通常经过优化。
- 读取输入: 读取完整的字符串。
- 调用函数: 直接调用语言提供的
replace
或类似功能的函数。- Python:
new_string = old_string.replace('5', '*')
- Java:
String newString = oldString.replace('5', '*')
- C++: 可以使用
std::replace
算法,或者直接遍历修改(因为字符串可变)。
- Python:
- 输出: 打印函数返回的新字符串。
对于这道题,使用内置函数法无疑是最高效、最简单的。
代码
#include <iostream>
#include <string>
// C++的string是可变的,可以直接在原字符串上修改。
// 使用范围for循环和引用是一种简洁的实现方式。
int main() {
std::string s;
std::cin >> s;
for (char &c : s) { // 使用引用(&)来允许修改字符
if (c == '5') {
c = '*';
}
}
std::cout << s << std::endl;
return 0;
}
import java.util.Scanner;
// Java的String是不可变的,replace方法会返回一个新的字符串。
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
// 调用String类的replace方法
String result = s.replace('5', '*');
System.out.println(result);
}
}
# 读取输入字符串
s = input()
# Python的str是不可变的,replace方法会返回一个新的字符串
result = s.replace('5', '*')
print(result)
算法及复杂度分析
您提出的关于空间复杂度的观点非常有价值,这引出了一个关于"辅助空间"和"总空间"的重要区别。
- 算法: 字符串遍历与替换。
- 时间复杂度:
,其中
L
是字符串的长度。无论是遍历还是使用内置函数,都需要扫描整个字符串至少一次。 - 空间复杂度:
- 总空间复杂度: 所有解法都需要
的空间来存储输入的字符串本身。
- 辅助空间复杂度: 这是指除了输入数据外,算法额外需要的空间。
- C++ 解法:
。因为 C++ 的
std::string
是可变的,我们的代码直接在原字符串上进行修改(in-place),没有创建新的字符串副本。 - Java 和 Python 解法:
。因为 Java 和 Python 的字符串是不可变的,
replace
操作会创建一个全新的字符串来存放结果,因此需要与原字符串等长的额外空间。
- C++ 解法:
- 总空间复杂度: 所有解法都需要