微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在字符串 C++ 中切换 a 和 b [代码战争问题]

如何解决在字符串 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 举报,一经查实,本站将立刻删除。