【卡码网C++基础课 12.位置互换】


题目描述与分析

题目描述:
给定一个长度为偶数位的字符串,请编程实现字符串的奇偶位互换

输入描述:
输入包含多组测试数据。
输入的第一行是一个整数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;
    }
}
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值