我正在做codingbat.com练习。我对此练习有问题:我们会说,如果对于字符串中的所有" x"字符,则在字符串后面某个地方存在一个" y" char。因此," xxy"是平衡的,但" xyx"不是。一个" y"可以平衡多个X。如果给定的字符串是xy平衡的,则返回true。
xyBalance("aaxbby") → true
xyBalance("aaxbb") → false
xyBalance("yaaxbb") → false
我知道正确的解决方案,但我很好奇为什么以下解决方案不起作用:
public boolean xyBalance(String str) {
for(int i = 0; i < str.length() -1 ;i++) {
if(str.indexOf("x") == -1 ) {
return true;
}
else if(str.charAt(str.length()-1) == 'x') {
return false;
}
else if (str.indexOf("x",i) < str.indexOf("y",i)) {
return true;
}
}
return false;
}
此代码除了两个示例案例以外的所有代码:
xyBalance("y") → true **my code returns false**
xyBalance("") → true **my code returns false**
有人可以解释为什么吗?谢谢=]
如果传递的String
为空,则永远不会输入循环,因此该方法会自动返回false
。循环以i = 0
开头,试图匹配条件i < str.length() - 1
,其中str.length() - 1
评估为-1,因为String
是空的,并且自动中止。
无论哪种方式,此代码都浪费了很多计算能力。有很多简单的解决方案可用:
问题可以转化为
a
中未发生'x'String
是平衡的,如果在String
使整个问题变得更简单:
public boolean xyBalanced(String s){
return s.lastIndexOf('x') <= s.lastIndexOf('y');
}
您获得字符串 "y"
的错误结果的原因是,循环中的条件是运行到 i < str.length() -1
之前,修复程序将更改运行的条件直到以下条件:i < str.length()
,您不会错过最后一个角色。
对于在空字符串上运行代码,由于字符串的长度为零,因此根本不会进入循环,因此将返回false
-因此,这实际上是一个很好的结果!