位置互换

前言

本节课我们将通过一个案例实现字符串的奇偶位互换。

奇偶位互换是指字符串的奇数位和偶数位相互交换位置,比如下面的字符串"0aa0", 前两位相互交换,后两位相互交换,返回的结果是a00a

image-20230920151637341

想要完成字符串交换,需要完成以下步骤:

  • 遍历字符串

  • 第1位和第2位交换

  • 第3位和第4位交换

  • ...

  • 第i位和第i + 1位交换

  • 第i+2位和第i+3位交换

可以看到交换的操作是一直都有的,对于这个一直存在的操作,我相信大家一定能联想到上一节的函数,那我们就先来看看这个交换字符串的函数是怎么写的吧。

交换变量

两个字符是如何相互交换的呢?

想象一下,你现在手里有两个杯子,一个杯子里装了雪碧,另一个杯子里装了可乐,要怎么把这两个杯子的饮料相互交换呢?

常规情况下当然是不可能把这两个杯子里的饮料直接进行交换的,我们应该引入第三个杯子。

image-20230912105300842

  • 把第一个杯子里的雪碧倒入第三个杯子中,这样第一个杯子就成了空杯子,第三个杯子里盛放的是雪碧

  • 再把第二个杯子里的可乐倒入第一个杯子中,这样第二个杯子就是空的,第一个杯子里装的是可乐

  • 再把之前倒入第三个杯子里的雪碧倒入第二个杯子中,这样第二个杯子装的是雪碧

经过上面的操作,就将两个杯子里的可乐和雪碧完成了交换,该操作转换成代码如下:

// 不返回(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;
    }
}

总结

字符串的学习也到此为止了,但字符串的应用会无处不在,经过这两节内容的学习,你是否对字符串有了更深的认识呢?

不会做游戏!