You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++字符串中交换a与b的位置问题(Code Wars题目)

字符串a/b互换算法的问题排查与修复

我正在解决一道算法题,要求实现将字符串中所有的a和b互相交换位置。我之前做过类似的元音交换问题,想着复用相同的思路,但写出来的代码没法正确实现需求,想请教这段代码哪里错了。

我的代码如下:

#include <string>
#include <algorithm>
using namespace std;
std::string switcheroo(const std::string &s) {
 string myString = s;
 int i = 0;
 int j = s.length();
 if(s[i] != 'a' || s[i] != 'b') i++;
 if(s[j] != 'a' || s[j] != 'b') j--;
 else {
 swap(myString[i],myString[j]);
 }
 return myString;
}

问题拆解与分析

咱们来一步步揪出代码里的问题:

  • 逻辑判断的致命错误:你写的if(s[i] != 'a' || s[i] != 'b')这个条件永远为真!因为一个字符不可能同时既是a又是b,不管当前字符是啥,这个条件都会成立,导致i一直自增,根本碰不到交换的逻辑。
  • 指针初始化与循环缺失:首先j初始设为s.length(),这个位置是字符串末尾的下一位(字符串索引从0开始),访问s[j]会直接越界,属于未定义行为。其次,你只做了一次指针移动和交换操作,没有循环遍历整个字符串,怎么可能处理所有的a和b呢?
  • 需求理解偏差:你之前的元音交换是交换不同元音的位置,但这次的需求是所有a变成b,所有b变成a,其他字符不变——这其实是逐个替换的逻辑,不是双指针交换位置的思路,复用之前的写法就走偏啦。

修复方案

方案一:逐个字符替换(最直观高效)

这个需求其实很简单,遍历字符串每个字符,遇到a就换成b,遇到b就换成a,其他字符保持原样就行:

#include <string>
using namespace std;

std::string switcheroo(const std::string &s) {
    string result = s;
    for (char &c : result) { // 用引用直接修改字符串中的字符
        if (c == 'a') {
            c = 'b';
        } else if (c == 'b') {
            c = 'a';
        }
        // 非a/b的字符跳过,不做修改
    }
    return result;
}

方案二:调整双指针逻辑(满足你复用思路的想法)

如果一定要用双指针的方式实现,那得修正指针初始化和循环逻辑,确保能遍历所有需要处理的字符:

#include <string>
#include <algorithm>
using namespace std;

std::string switcheroo(const std::string &s) {
    string result = s;
    int left = 0;
    int right = result.length() - 1; // 初始化为最后一个有效索引,避免越界
    
    while (left < right) {
        // 左指针找到第一个a或b
        while (left < right && result[left] != 'a' && result[left] != 'b') {
            left++;
        }
        // 右指针找到最后一个a或b
        while (left < right && result[right] != 'a' && result[right] != 'b') {
            right--;
        }
        // 交换两个字符,然后移动指针继续遍历
        if (left < right) {
            swap(result[left], result[right]);
            left++;
            right--;
        }
    }
    return result;
}

不过要说明的是,双指针版本的效果和逐个替换是一致的,但逐个替换的写法更简洁易懂,也更不容易出错。


内容的提问来源于stack exchange,提问作者austinvan295

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 13:33:14