【问题标题】:Why is my code returning false for the following conditions?为什么我的代码在以下情况下返回 false?
【发布时间】:2017-05-07 14:31:39
【问题描述】:

我正在做 Codingbat.com 练习。我在这个练习中遇到了问题: 如果对于字符串中的所有 'x' 字符,在字符串后面的某处存在一个 'y' 字符,我们会说一个字符串是 xy 平衡的。所以“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** 

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

【问题讨论】:

    标签: java string if-statement boolean indexof


    【解决方案1】:

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

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

    问题可以翻译成

    如果String 中最后一个“y”之后没有出现“x”,则String 是平衡的

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

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

    【讨论】:

    • 感谢您的解释!我很感激,并感谢您提供更简单的解决方案。我是新手,即使那样我也不会哈哈
    • @PiyushKumar 很高兴为您提供帮助 :)
    【解决方案2】:

    字符串"y" 得到错误结果的原因是for 循环中的条件是运行到i &lt; str.length() -1,修复方法是将条件更改为运行到:i &lt; str.length() 所以你不会错过最后一个字符。

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

    【讨论】:

      猜你喜欢
      • 2015-03-06
      • 2016-03-02
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      相关资源
      最近更新 更多