Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 切换a';s和b';字符串C+中的s+;[代码战争问题] #包括 #包括_C++_C++11 - Fatal编程技术网

C++ 切换a';s和b';字符串C+中的s+;[代码战争问题] #包括 #包括

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'

它想让我切换a和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;
}