Java 以下哪种解决方案具有更好的风格/性能?
我发现了一个关于codingBat的有趣练习,现在我有一个关于解决方案的问题。任务是: 给定一个字符串,如果字符串中的Java 以下哪种解决方案具有更好的风格/性能?,java,optimization,Java,Optimization,我发现了一个关于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.index
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");
所以现在我的问题是哪种解决方案具有更好的编码风格?哪种解决方案更漂亮或更有效
感谢您的所有回答我可能会这样编码:
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');
}
boolean doubleX(字符串str)
{
int index=str.indexOf(“x”);
返回(索引>=0&&index
想象一下,您是另一位前来阅读您的解决方案的程序员。每件事都在一条线上争论不休,需要一些额外的时间来消化每一种情况以及它们如何实际协同工作。如果编译器是一个好的编译器,性能实际上不会有太大差别,因为它实际上会检测变量并以不同的方式对可执行文件进行编码1)更好的编码风格:codingBat解决方案。因为很容易理解。2) 漂亮的:codingBat解决方案。好的、清晰的、高效的:这要看情况了。str.indexOf(“xx”)怎么样?这更具可读性,使用标准库代码,因此性能更好。@BoristheSpider:哦,好吧,我明白你的意思了:)它只用于首次出现x。对不起,我误解了。是的,对不起@BoristheSpider和onCC,我的错误,没有正确阅读问题:(注意charAt
是O(1)
-这只是一个数组访问。@Boris:charAt()
可能是O(1),但可能仍然很慢。无论如何,使用charAt()
您必须首先检查您是否超出字符串的末尾,等等。我想我的孤子不是性能最好的,只是相当优雅。事实上,性能并不相关,这是一个两遍解决方案。但我喜欢它,因为它可读性很强。此代码可读性很好,但效率不高。想象一个非常长的字符串gth说查找第一个x需要5分钟。然后第二次扫描查找xx需要另外5分钟,这将是不正确的。相反,一旦找到,它应该只检查下一个可用字符,并返回结果,而不是重复扫描。“也许性能更好”肯定是这样。想象一下字符串“xaaaaaaaaa…(100万件不是xs的东西)xx”。