2016-12-22 116 views
1

我做Codingbat.com练习。我有一个问题,这个练习: 我们会说一个字符串是XY平衡,如果该字符串中的所有“X”字符,有串在以后的某个地方存在“Y”字符。所以“xxy”是平衡的,但“xyx”不是。一个'y'可以平衡多个'x'。如果给定字符串是xy平衡的,则返回true。为什么我的代码返回false以下条件?

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

该回路从未进入,如果传递的String是空的,因此该方法将自动返回false。循环以i = 0开头,尝试匹配条件i < str.length() - 1,其中str.length() - 1的计算结果为-1,因为String为空,并自动中止。

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

问题可以转化为

一个String是平衡的,如果没有“X”出现在最后的“是”的String

这使得整个问题变得简单许多:

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

谢谢你解释!我很感激,并感谢您提供更简单的解决方案。我是一个新手,我从来没有,即使有关哈哈 –

+0

@PiyushKumar很高兴帮助:) – Paul

0

你得到错误的结果的字符串"y"的原因是,在for循环的条件是,直到i < str.length() -1运行,修复将改变状态,直到运行:i < str.length()所以你不会错过最后一个字符。

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

+0

谢谢你解释! –