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

时间:2016-12-22 02:55:53

标签: java string if-statement boolean indexof

我正在做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** 

有人可以解释为什么吗?谢谢你=]

2 个答案:

答案 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为空并自动中止。

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

问题可以转化为

  

如果String

中的最后一个'y'后面没有'x',则String是平衡的

这使得整个问题变得更加简单:

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