我正在做Codingbat.com练习。我这个练习有问题: 如果对于所有' x'我们会说字符串是xy平衡的。字符串中的字符,存在一个' y' char后面的字符串中的char。所以" xxy"是平衡的,但" xyx"不是。一个人'可以平衡多个x&x; s。如果给定的字符串是xy-balanced,则返回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**
有人可以解释为什么吗?谢谢你=]
答案 0 :(得分:0)
你得到字符串"y"
的错误结果的原因是for循环中的条件要运行到i < str.length() -1
,修复将改变条件运行直到: i < str.length()
所以你不会错过最后一个角色。
至于在空字符串上运行代码,由于字符串的长度为零,它根本不会进入for循环,因此将返回false
- 所以这实际上是一个很好的结果!
答案 1 :(得分:0)
如果传递的String
为空,则永远不会输入循环,因此该方法会自动返回false
。循环以i = 0
开头,尝试匹配条件i < str.length() - 1
,其中str.length() - 1
的计算结果为-1,因为String
为空并自动中止。
无论哪种方式,这段代码都浪费了相当多的计算能力。有一个更简单的解决方案:
问题可以转化为
如果
中的最后一个'y'后面没有'x',则String
String
是平衡的
这使得整个问题变得更加简单:
public boolean xyBalanced(String s){
return s.lastIndexOf('x') <= s.lastIndexOf('y');
}