题目描述与分析
题目描述:
给定一个长度为偶数位的字符串,请编程实现字符串的奇偶位互换
输入描述:
输入包含多组测试数据。
输入的第一行是一个整数n,表示有测试数据。(整个输入中,只有一个n)
接下来是n组测试数据,保证串长为偶数位(串长<=50)。
输出描述:
请为每组测试数据输出奇偶位互换后的结果,每组输出占一行。
输入示例:
2
0aa0
bb00
输出示例:
a00a
bb00
奇偶位互换是指字符串的奇数位和偶数位相互交换位置,比如下面的字符串"0aa0", 前两位相互交换,后两位相互交换,返回的结果是a00a
想要完成字符串交换,需要完成以下步骤:
遍历字符串
第1位和第2位交换
第3位和第4位交换
…
第i位和第i + 1位交换
第i+2位和第i+3位交换
可以看到交换的操作是一直都有的,对于这个一直存在的操作,我相信大家一定能联想到上一节的函数,那我们就先来看看这个交换字符串的函数是怎么写的吧。
一、交换变量
两个字符是如何相互交换的呢?
想象一下,你现在手里有两个杯子,一个杯子里装了雪碧,另一个杯子里装了可乐,要怎么把这两个杯子的饮料相互交换呢?
常规情况下当然是不可能把这两个杯子里的饮料直接进行交换的,我们应该引入第三个杯子
把第一个杯子里的雪碧倒入第三个杯子中,这样第一个杯子就成了空杯子,第三个杯子里盛放的是雪碧
再把第二个杯子里的可乐倒入第一个杯子中,这样第二个杯子就是空的,第一个杯子里装的是可乐
再把之前倒入第三个杯子里的雪碧倒入第二个杯子中,这样第二个杯子装的是雪碧
经过上面的操作,就将两个杯子里的可乐和雪碧完成了交换,该操作转换成代码如下:
// 不返回(return)结果,所以返回类型为void, 函数名称为swap
// 传入的参数为两个字符,所以类型为char, 参数名称为a 和 b
void swap(char &a, char &b) { // 交换两个字符串, a和b的内容需要改变,所以需要传递引用
// 定义第三个字符,并将字符a的内容赋值给第三个字符
char tmp = a;
// 将字符a的内容修改为字符b的内容
a = b;
// 将字符b的内容修改为第三个字符的内容,也就是字符a的内容,a和b之间完成替换
b = tmp;
}
二、代码编写
照例,我们先把代码的基础结构先写好
#include<iostream>
#include<string>
using namespace std;
int main() {
int n;
cin >> n; // 输入n,表示包含n组字符串
string s; // 接受每次输入的字符串
while(n--) {
cin >> s; // 输入字符串
}
}
把之前写的swap函数定义完整
void swap(char &a, char &b) { // 交换两个字符串
char tmp = a;
a = b;
b = tmp;
}
接着,我们需要遍历字符串,并将当前字符和下一位字符两两交换,当完成第一位和第二位的交换之后,我们应该控制迭代的步数为2,执行第三位和第四位的交换。
for (int i = 0; i < s.size() - 1; i += 2) { // 遍历字符串的时候注意控制迭代的步数为2
// 当前字符和下一个字符进行交换
swap(s[i], s[i + 1]);
}
将完成互换的字符串输出即可
cout << s << endl;
完整代码如下:
#include<iostream>
#include<string>
using namespace std;
void swap(char &a, char &b) { // 交换两个字符串
char tmp = a;
a = b;
b = tmp;
}
int main() {
int n;
cin >> n;
string s;
while (n--) {
cin >> s; // 接收字符串s
for (int i = 0; i < s.size() - 1; i += 2) { // 在s字符串上原地修改
swap(s[i], s[i + 1]); // 调用函数,完成字符串交换
}
cout << s << endl;
}
}