💪蓝蓝计算机考研算法-day12字符串转换

124 阅读2分钟

Day12 2023/03/11

难度:简单

题目

编写一个程序实现将字符串中的所有"you"替换成"we"

  • 输入:包含多行数据每行数据是一个字符串,长度不超过1000,数据以EOF结束
  • 输出:对于输入的每一行,输出替换后的字符串

示例1

输入:you love it!
输出:we love it!
说明:将you替换为了we

运行实例

image.png

思路


其实大多数人第一反应就是如何将字符串中的you替换成we,可能通过某些自带的函数方法,或者其他的各种方式,但其实不需要真正的改变字符串,我们要的其实就是一个打印效果,所以我们不妨换个角度,紧扣打印效果这个点去思考!我们为什么不能在遇到you的时候不打印它,改为打印we呢?(😏!!!)
具体实现:

  1. 通过一个for循环,遍历一组字符串。
  2. 通过一个if判断来实现将打印you,改为打印we。
  3. 通过更新循环变量来实现,跳过you.

关键点


  • 循环结束后这句代码,cout << endl;(实现换行),目的是为了避免手动换行导致在输入缓冲区中生成回车,影响下次循环。
  • 这里采用getline函数的不仅可以接收空格,而且每次输入完成后,还会舍弃掉输入流中的回车这样的结束符,减少因结束符导致的一些bug!

算法实现


c++代码实现-字符串替换

#include <iostream>
#include <string>
using namespace std;

// 字符串替换
int main() {
  string str = "";                                   // 每行字符串
  while (getline(cin, str) && str.size() <= 1000) {  // 测试多行
    for (int i = 0; i < str.size(); i++) {
      if (str[i] == 'y' && str[i + 1] == 'o' && str[i + 2] == 'u') { // 遇到you打印we
        cout << "we";
        i += 2;
      } else cout << str[i];
    }
    cout << endl;  // 避免手动回车
  }
  return 0;
}

  • 时间复杂度 O(n)O(n)--- 除去输入数据占用的时间外,仅遍历一组字符串,其中n为字符串长度
  • 空间复杂度 O(1)O(1)--- 仅常数级变量,无额外的辅助空间

总结

解题,有时候要根据题意,做一些 "变通",我们可以接受思维定式,但同时也要能接受新的,更高效的解题方式!!!