2016-12-22 57 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

謝謝你解釋! –