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
相关产品推荐
相关产品推荐

