题目链接

年轻人不讲5的

题目描述

根据题意,给定一个只包含数字的非空字符串,你需要将其中所有的字符 5 替换为符号 *,并输出替换后的结果。

输入描述:

  • 在一行输入一个只包含数字的非空字符串,长度不超过 1000。

输出描述:

  • 输出一个字符串,为将所有字符 5 替换为 * 后的结果。

示例1:

  • 输入:
    114514
    
  • 输出:
    114*14
    
  • 说明: 输入中的字符 5 被替换为了 *

解题思路

这是一个典型的字符串替换问题,解法非常直接。主要有两种思路:

思路一:遍历字符 (基础方法)

这是最基本、最通用的方法,不依赖于特定的高级函数。

  1. 读取输入: 读取完整的字符串。
  2. 遍历: 使用一个循环,逐一检查输入字符串中的每一个字符。
  3. 判断与替换: 在循环中,判断当前字符是否为 '5'
    • 如果是,则在新的结果字符串中添加 '*'
    • 如果不是,则将原字符添加到结果字符串中。
  4. 输出: 循环结束后,打印构建好的新字符串。

在 C++ 中,由于 std::string 是可变的,可以直接在原字符串上进行修改,从而节省空间。

思路二:使用内置替换函数 (推荐)

大多数现代编程语言都提供了内置的字符串替换函数,这是解决此类问题的首选方法,因为它代码简洁、可读性高且通常经过优化。

  1. 读取输入: 读取完整的字符串。
  2. 调用函数: 直接调用语言提供的 replace 或类似功能的函数。
    • Python: new_string = old_string.replace('5', '*')
    • Java: String newString = oldString.replace('5', '*')
    • C++: 可以使用 std::replace 算法,或者直接遍历修改(因为字符串可变)。
  3. 输出: 打印函数返回的新字符串。

对于这道题,使用内置函数法无疑是最高效、最简单的。

代码

#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 操作会创建一个全新的字符串来存放结果,因此需要与原字符串等长的额外空间。