Acwing 766. 去掉多余的空格(双指针算法)

本文介绍了一种去除字符串中多余空格的方法,使用双指针算法处理通过getline()读取的整行字符串,保留单个空格并移除连续重复的空格。

题干:

输入一个字符串,字符串中可能包含多个连续的空格,请将多余的空格去掉,只留下一个空格。

输入格式:

共一行,包含一个字符串。

输出格式:

输出去掉多余空格后的字符串,占一行。

分析:

在字符串的读入中,由于cin和scanf可以自动过滤空格和换行,因此容易得到eazy版本的解题方法,如下:

#include <iostream>

using namespace std;

int main()
{
	string s;
	while ( cin >> s ) {
		cout << s << ' ' ;
	}
	
	return 0;
}

但是我们并不满足于这种简单的解题方法,

我们知道,关于字符串的读入,可以利用getline()读入整行字符串(包括空格和换行),那么在此基础上,我们只需要再对已经读入的整行字符串进行处理,将其中连续重复出现的空格跳过,并输出处理过的字符串即可,由此引出今天的主要内容:“第一类双指针算法”

具体方法如下:

#include <iostream>

using namespace std;

int main()
{
	string s;

	getline ( cin , s );
	
	string r;
	for ( int i = 0; i < s.size() ; i++ ){
		if ( s[i] != ' ' ){
			r += s[i];
		}else {
			r += ' ';
			
			int j = i;
			while ( s[j] == ' ' ) j++;  //跳过重复的空格
			
			i = j - 1; //注意此时i的值还未+1
		}
	}
	
	cout << r << endl ;
	
	return 0;
}

(ps:初学者学习记录)

### 关于双指针算法的学习资源 #### 来自AcWing平台的双指针算法介绍 在AcWing平台上,双指针算法被描述为一种非常优雅且高效的解决方案[^1]。该方法不仅用于快速排序和归并排序中的特定操作,还广泛应用于处理涉及单个或多个序列的问题。 #### 应用场景详解 对于单一序列的情况,双指针通常用来维护一段区间的特性;而对于两个不同的序列,则通过调整两者的相对位置来保持某些顺序关系。例如,在寻找两个数组中元素之和等于给定目标值的任务里,可以通过设置一对指向不同列表末端的指针逐步逼近答案[^3]。 #### 实现细节分析 具体实现上,考虑这样一个例子:为了找出最长不含重复字符子串长度的问题时,采用了一种巧妙的方式利用了所谓的“快慢指针”。这里,“快”指的是遍历整个字符串的那个索引变量`i`,而“慢”的则是标记起始点的另一端`j`。每当遇到新的字符加入窗口内(由这两个下标界定),都会检查是否有冲突发生,并相应地调整后者的位置以确保唯一性约束得到满足[^2]。 ```cpp #include <iostream> using namespace std; const int N = 1e5 + 10; int n, m, x; int a[N], b[N]; int main() { cin >> n >> m >> x; for (int i = 0; i < n; ++i) cin >> a[i]; for (int i = 0; i < m; ++i) cin >> b[i]; for (int i = 0, j = m - 1; i < n && j >= 0;) { if (a[i] + b[j] > x) --j; else if (a[i] + b[j] == x){ cout << i << " " << j << "\n"; break; } else ++i; } return 0; } ``` 这段代码展示了如何在一个简单的应用场景中运用双指针技术解决实际问题。它接收三个整数参数作为输入,分别代表第一个数组大小、第二个数组大小以及期望达到的目标数值。接着读取这两组数据存入各自的一维数组中。最后部分实现了核心逻辑——即通过控制两条游标的前进方向与速度完成匹配过程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值