【问题标题】:Which one of these solutions has a better style/performance? [closed]这些解决方案中哪一个具有更好的风格/性能? [关闭]
【发布时间】:2018-10-14 19:55:58
【问题描述】:

我发现了一个关于codingBat 的有趣练习,现在我有一个关于解决方案的问题。任务是:

给定一个字符串,如果字符串中x 的第一个实例紧跟着另一个x,则返回true

我写的是:

boolean doubleX(String str) {
      return str.contains("x") ? str.indexOf('x') == str.length() - 1 ? false : str.charAt(str.indexOf('x')) == str.charAt(str.indexOf('x') + 1) : false;
}

他们在页面上的解决方案是:

boolean doubleX(String str) {
   int i = str.indexOf("x");
   if (i == -1) return false; // no "x" at all

   // Is char at i+1 also an "x"?
   if (i+1 >= str.length()) return false; // check i+1 in bounds?
      return str.substring(i+1, i+2).equals("x");

所以现在我的问题是哪种解决方案具有更好的编码风格?哪个解决方案更美观甚至更高效?

感谢所有回答

【问题讨论】:

  • 假设您是另一个阅读您的解决方案的程序员。一切都在一条线返回上争论不休,需要一些额外的时间来吸收每种情况以及它们如何实际协同工作。如果编译器是好的编译器,性能实际上不会有太大差异,因为它实际上会检测变量并以不同的方式对可执行文件进行编码
  • 1) 更好的编码风格:codingBat 解决方案。因为容易理解。 2)美观:codingBat 解决方案。漂亮而清晰 3) 高效:这取决于。
  • 怎么样 str.indexOf("xx"); ?这更具可读性并使用标准库代码,因此性能更高。
  • @BoristheSpider:哦,好吧,我明白了你的意思:) 它专门用于 x 的第一次出现。对不起,我误解了。
  • 是的,对不起@BoristheSpider 和 onCC,我的错误,没有正确阅读问题:(

标签: java optimization


【解决方案1】:

我可能会这样编码:

boolean doubleX(String str) 
{
    int index = str.indexOf("x");
    return (index >= 0 && index == str.indexOf("xx", index));
}

可能不是最高效的,但它可以处理所有可能性。

如果indexOf("x")indexOf("xx") 相距很远(不必要,长时间搜索"xx")或者如果两个索引都非常高(长时间搜索完成了两次),它可能会很慢。

因此,另一个稍微不那么直观但性能更高的解决方案可能是:

boolean doubleX(String str)
{
    int index = str.indexOf("x");
    return (index >= 0 && index < str.length() - 1 && str.charAt(index + 1) == 'x');
}

【讨论】:

  • 请注意 charAtO(1) - 它只是一个数组访问。
  • @Boris: charAt() 可能是 O(1),但它可能仍然很慢。无论如何,使用charAt() 您必须首先检查您是否没有超出字符串的末尾等。同样,我想我的解决方案不是性能最高的,而是相当优雅。
  • 确实 - 性能并不真正相关,这是一个两遍解决方案。但我喜欢它,因为它非常易读。
  • 这段代码可读但效率不高。想象一个很长的字符串,比如找到第一个 x 需要 5 分钟。然后第二次扫描寻找 xx 将需要另外可怕的 5 分钟,这是不正确的。相反,一旦找到,它应该只检查下一个可用字符并返回结果而不是重复扫描。
  • “也许性能更高”肯定如此。想象一下字符串“xaaaaaaaaaaa...(100 万个非 xs)xx”。
猜你喜欢
  • 2015-03-15
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多