C++ 切换a';s和b';字符串C+中的s+;[代码战争问题] #包括 #包括
它想让我切换a和b的实例,我以前也做过切换元音的问题,所以同样的算法应该可以工作。我的代码做错了什么?这是一个通过所有测试的函数版本 因为参数C++ 切换a';s和b';字符串C+中的s+;[代码战争问题] #包括 #包括,c++,c++11,C++,C++11,它想让我切换a和b的实例,我以前也做过切换元音的问题,所以同样的算法应该可以工作。我的代码做错了什么?这是一个通过所有测试的函数版本 因为参数s是作为const的引用传入的,所以我们不能直接对其进行更改。因此,我们声明一个新字符串,tmp,并逐字构建它。钥匙在s中循环,以便我们可以检查每个字母。如果是'a',则将a'b'添加到tmp。如果是a'b',我们将'a'添加到tmp。如果两者都不是,我们就按原样加上那个字母。当循环结束时,我们已经查看了s中的每个字母,并构建了tmp,其中'a's和'b'
s
是作为const的引用传入的,所以我们不能直接对其进行更改。因此,我们声明一个新字符串,tmp
,并逐字构建它。钥匙在s
中循环,以便我们可以检查每个字母。如果是'a'
,则将a'b'
添加到tmp
。如果是a'b'
,我们将'a'
添加到tmp
。如果两者都不是,我们就按原样加上那个字母。当循环结束时,我们已经查看了s
中的每个字母,并构建了tmp
,其中'a'
s和'b'
s被交换。所以我们返回tmp
std::string开关o(const std::string&s){
std::字符串tmp;
用于(常数自动和i:s){
如果(i='a'){
tmp.推回(“b”);
}else如果(i='b'){
tmp.推回(“a”);
}否则{
tmp.推回(i);
}
}
返回tmp;
}
根据您的评论,这里是另一个通过所有测试并使用std::transform()
的版本
#包括
#包括
#包括
std::string switchero(const std::string&s){
std::字符串tmp;
std::transform(s.begin()、s.end()、std::back_插入器(tmp),
[](const auto&i){
如果(i='a'){返回'b';}
如果(i='b'){返回'a';}
返回i;
});
返回tmp;
}
如果不运行探查器,我不能说这段代码是否更快,但lambda的构建方式让我认为它可能有一点性能优势。这是因为连续的
if
语句可能比大型if/else
块更快。除非正在处理的字符串非常大,否则您可能不会看到很大的差异。如果else构造看起来可疑,很可能是您混淆的原因。您的条件总是正确的,请尝试思考原因。Assert::that(switchero(“bbbbb”),等于(“aaaa”)代码>:您不必交换位置,只需逐个转换字母。您缺少一个循环…s[i]!='a'| | s[i]!='b'
总是正确的,您在字符串外部建立索引,最多交换字符串的两个字符。你不觉得你需要一个环吗?啊,明白了!这是最有效的方法吗?最快的解决方案是什么?我们不能使用一个函数,将a的每次出现转换为b,反之亦然,就像使用转换函数一样吗?因为s
被视为常量的引用,所以它不能被更改。虽然您可能可以使用标准库中的一些东西,用更少的代码行来做一些事情,但实际的运行时是类似的。如果不检查s
的每个字符,就无法完成此操作,因此您总是会以O(n)运行时结束。Sheesh man您是否只记得头顶上的lamda函数,还是必须查找它通常会导致在使用[](const auto&i)时代码有点混乱。不过很干净。
#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;
}