find() 方法和substr()方法
2026-09-19 14:07:13
发布于:湖北
一、题目到底要做什么?
小明拿到一个字符串,例如:
sdfd 55 55 99312
然后按照规定不断分割。
第一次:
从左往右找到第一个空格,在这个空格处分割。
所以:
sdfd 55 55 99312
变成:
左边:sdfd
右边:55 55 99312
输出左边:
sdfd
第二次,对剩下的右边继续操作:
55 55 99312
找到连续两个空格:
55 55 99312
^^
分割:
左边:55 55
右边:99312
输出:
55 55
第三次:
99312
里面已经没有连续三个空格了。
所以不能继续分割。
于是最后输出剩下的:
99312
最终:
sdfd
55 55
99312
二、这道题真正考什么?
这道题主要考两个东西:
① 字符串查找
我们需要找到:
一个空格
两个连续空格
三个连续空格
...
② 字符串截取
找到位置以后,把字符串分成:
左边部分
右边部分
三、一个非常重要的细节
第一次找:
1个空格
第二次找:
2个连续空格
第三次找:
3个连续空格
第四次找:
4个连续空格
也就是说:
第1次:找 " "
第2次:找 " "
第3次:找 " "
第4次:找 " "
这就是题目的核心规律。
find() 可以直接查找一个字符串第一次出现的位置;找不到时返回 string::npos。
1. 核心思路
第几次分割,就找几个连续的空格:
第1次:find(" ")
第2次:find(" ")
第3次:find(" ")
第4次:find(" ")
例如:
sdfd 55 55 99312
第一次:
pos = s.find(" ");
找到第一个空格。
然后:
s = s.substr(pos + 1);
把这个空格以及左边的内容去掉。
第二次就:
pos = s.find(" ");
找两个连续空格。
2. 完整代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
getline(cin, s);
int k = 1;
while (true) {
// 构造 k 个连续的空格
string space = "";
for (int i = 1; i <= k; i++) {
space += " ";
}
// 查找 k 个连续空格
int pos = s.find(space);
// 找不到
if (pos == string::npos) {
cout << s << endl;
break;
}
// 输出左边
cout << s.substr(0, pos) << endl;
// 删除左边以及这 k 个空格
s = s.substr(pos + k);
// 下一次需要更多空格
k++;
}
return 0;
}
3. 样例执行过程
输入:
sdfd 55 55 99312
第一次
k = 1;
space = " ";
相当于:
pos = s.find(" ");
找到:
sdfd 55 55 99312
↑
输出:
sdfd
然后:
s = s.substr(pos + 1);
剩下:
55 55 99312
第二次
k = 2;
space = " ";
执行:
pos = s.find(" ");
找到:
55 55 99312
↑↑
输出:
55 55
然后去掉前面和这两个空格:
99312
第三次
k = 3;
space = " ";
执行:
pos = s.find(" ");
但是:
99312
里面没有三个连续空格。
所以:
pos == string::npos
直接输出:
99312
最终:
sdfd
55 55
99312
因为这道题的输入是一整行字符串,而且空格本身就是题目中的重要内容,所以要用 getline()
这里空空如也



有帮助,赞一个