如何移除字符串中各字符的奇数次出现实例?
解决字符串移除字符奇数次出现的问题
你现在的问题是搞混了字符串的奇数位置和字符的奇数次出现——原代码只是删掉了字符串中索引为0、2、4的字符(因为erase会改变字符串长度,循环逻辑实际是跳过了奇数索引的字符),所以得到了"BBA",但我们需要针对每个字符单独统计出现次数,只保留它的偶数次出现实例。
正确实现思路
因为字符串只包含A、B、C、D四个字符,用一个小型计数器数组就能轻松跟踪每个字符的出现次数:
- 初始化长度为4的数组,分别对应A、B、C、D的出现次数,初始值全为0
- 遍历原字符串的每个字符:
- 找到当前字符对应的计数器索引,把计数加1
- 如果计数是偶数,说明这是该字符的偶数次出现,把它加到结果字符串里
- 最后输出结果就行
完整代码
#include <iostream> #include <string> using namespace std; int main() { string input = "ABBBCA"; string result; // 索引0=A,1=B,2=C,3=D,记录每个字符的出现次数 int count[4] = {0}; for (char c : input) { int idx; // 匹配字符对应的计数器索引 switch(c) { case 'A': idx = 0; break; case 'B': idx = 1; break; case 'C': idx = 2; break; case 'D': idx = 3; break; default: idx = -1; // 题目限定只有ABCD,这里可以忽略 } count[idx]++; // 只保留偶数次出现的字符 if (count[idx] % 2 == 0) { result += c; } } cout << "处理后的字符串:" << result << endl; // 输出 BA return 0; }
代码解释
- 用
switch把每个字符映射到对应的计数器位置,保证每个字符的计数互不干扰 - 测试输入
"ABBBCA"时的具体处理:- A:第1次出现(计数1,奇数,移除)、第6次出现(计数2,偶数,保留)
- B:第1次(计数1,移除)、第2次(计数2,保留)、第3次(计数3,移除)
- C:第1次(计数1,移除)
最终结果就是"BA",完全符合你的需求
内容的提问来源于stack exchange,提问作者AKDLd
相关产品推荐
相关产品推荐

