为什么我的代码在以下情况下返回 false?

Why is my code returning false for the following conditions?

我正在做 Codingbat.com 练习。我在这个练习中遇到了问题: 如果对于字符串中的所有 'x' 个字符,在字符串后面的某处存在一个 'y' 个字符,我们会说一个字符串是 xy 平衡的。所以 "xxy" 是平衡的,但 "xyx" 不是。一个 'y' 可以平衡多个 'x'。 Return 如果给定的字符串是 xy 平衡的,则为真。

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** 

谁能解释一下为什么?谢谢你 =]

您得到字符串 "y" 错误结果的原因是 for 循环中的条件是 运行 直到 i < str.length() -1,修复会改变运行 的条件直到:i < str.length() 这样您就不会错过最后一个字符。

至于运行空字符串上的代码,由于字符串的长度为零,它根本不会进入for循环,因此return false - 所以这实际上是一个很好的结果!

如果传递的 String 为空,则永远不会进入循环,因此该方法会自动 returns false。循环以 i = 0 开始,尝试匹配条件 i < str.length() - 1,其中 str.length() - 1 计算结果为 -1,因为 String 为空并自动中止。

无论哪种方式,此代码都会浪费相当多的计算能力。有一个更简单的解决方案可用:

问题可以转化为

A String is balanced, if no 'x' occurs after the last 'y' in the String

这让整个问题简单了很多:

public boolean xyBalanced(String s){
    return s.lastIndexOf('x') <= s.lastIndexOf('y');
}