1 条题解

  • 0
    @ 2026-6-19 10:30:29

    📝 题目大意

    给定一个长度为偶数的小写字母字符串 SS,依次将第 11 个和第 22 个字符交换、第 33 个和第 44 个字符交换……直至末尾,输出交换后的字符串。

    💡 解题思路

    1. 题目分析SS 长度不超过 100100,且保证为偶数,直接模拟即可。本质上是将字符串按相邻字符两两分组,每组内部交换顺序。
    2. 算法推导:遍历字符串,步长为 22(即每次处理一对相邻字符)。对于每一对 (Si,Si+1)(S_i, S_{i+1})ii00 开始),先输出 Si+1S_{i+1} 再输出 SiS_i,即可完成交换后的输出。代码中使用 printf("%c%c", s[i+1], s[i]) 直接按交换后的顺序打印,无需真正修改原字符串。
    3. 边界与细节:题目保证 SS 长度为偶数,因此不会出现落单字符。代码中 if (i+1 < len) 的 else 分支属于防御性写法,实际不会触发。

    ⏱️ 复杂度分析

    • 时间复杂度O(n)O(n),其中 nn 为字符串长度,只需一次遍历。
    • 空间复杂度O(1)O(1),仅使用常数额外空间。

    💻 标准代码 (C++)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main () {
    	string s;
    	cin >> s;
    	int len = s.size();
    	// 步长为 2,每次处理一对相邻字符
    	for (int i = 0; i < len; i += 2) {
    		// 按交换后的顺序输出:先输出 s[i+1] 再输出 s[i]
    		if (i + 1 < len) printf("%c%c", s[i + 1], s[i]);
    		else printf("%c", s[i]); // 防御性写法,题目保证偶数长度不会触发
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    685
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者