如何解决在字符串 C++ 中切换 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;
}
这是代码战争中代码卡塔问题的链接https://www.codewars.com/kata/57f759bb664021a30300007d/train/cpp
它想让我切换 a 和 b 的实例,我之前在切换元音时已经解决了这个问题,所以相同的算法应该可以工作。我的代码做错了什么?
解决方法
这是通过所有测试的函数版本。
因为参数 s
是作为对 const 的引用传入的,所以我们不能直接对其进行更改。因此,我们声明一个新字符串 tmp
,并逐个字母地构建它。关键是遍历 s
以便我们可以检查每个字母。如果是 'a'
,则将 'b'
添加到 tmp
。如果是 'b'
,我们将 'a'
添加到 tmp
。如果两者都不是,我们只需按原样添加该字母。到循环结束时,我们已经查看了 s
中的每个字母,并在 tmp
和 'a'
交换的情况下构建了 'b'
。所以我们返回 tmp
。
std::string switcheroo(const std::string &s) {
std::string tmp;
for (const auto& i : s) {
if (i == 'a') {
tmp.push_back('b');
} else if (i == 'b') {
tmp.push_back('a');
} else {
tmp.push_back(i);
}
}
return tmp;
}
根据您的评论,这是通过所有测试并使用 std::transform()
的另一个版本。
#include <string>
#include <algorithm>
#include <iterator>
std::string switcheroo(const std::string &s) {
std::string tmp;
std::transform(s.begin(),s.end(),std::back_inserter(tmp),[](const auto& i) {
if (i == 'a') { return 'b'; }
if (i == 'b') { return 'a'; }
return i;
});
return tmp;
}
如果不运行分析器,我不能说这段代码是否更快,但是 lambda 的构建方式让我认为它可能具有轻微的性能优势。这是因为连续的 if
语句可以比大的 if/else
块更快。除非正在处理的字符串很大,否则您可能不会看到大的差异。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。