为什么我的代码在以下条件下返回false



我正在做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 String是平衡的,如果在 String

中未发生'x'

使整个问题变得更简单:

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

您获得字符串 "y"的错误结果的原因是,循环中的条件是运行到 i < str.length() -1之前,修复程序将更改运行的条件直到以下条件:i < str.length(),您不会错过最后一个角色。

对于在空字符串上运行代码,由于字符串的长度为零,因此根本不会进入循环,因此将返回false-因此,这实际上是一个很好的结果!