2011-08-17 124 views
1

您好我一直在做Javabat練習,我發現自己在一個有點暴牙的這個問題:編程練習

我們會說一個字符串是XY均衡的,如果所有的「X」字符串中的字符,在字符串後面的某處存在'y'字符。所以「xxy」是平衡的,但「xyx」不是。一個'y'可以平衡多個'x'。如果給定字符串是xy平衡的,則返回true。

xyBalance("aaxbby") → true 

xyBalance("aaxbb") → false 

xyBalance("yaaxbb") → false 

public boolean xyBalance(String str) { 

    if(str.length() < 2){ 

    if(str == "x"){ 

    return false; 

    } 

    return true; 

    } 

    for (int i = 0 ; i < str.length()- 1;i++){ 

    if (str.charAt(i)=='x' && str.charAt(i + 1) == 'y'){ 

    return true; 

    } 

    } 

    return false; 
} 
+1

什麼是你的代碼錯誤?任何例外?意外的結果? – Marcelo

+1

考慮轉移到(http://codereview.stackexchange.com/)... – maerics

+2

讓我明白這一點!如果一個'y'可以平衡多個'x's,那麼字符串中單個'y'的出現是不是意味着它是xy平衡的,除非'y'後面跟着一個'x'? – gotomanners

回答

1

你的方法,因爲它找到一個'x'緊接着給定的字符串在'y'儘快返回true。所以在大多數情況下,它會給您的原始問題帶來不正確的結果。

我不給你完整的解決方案,只是一個提示,讓你真正學會自己解決問題。基本上,您需要確定最後一次出現'x'後字符串中是否有'y'。爲此,請使用String.lastIndexOf

+0

我underrstand,我不知道如何使該方法返回true,如果它發現一個x之後,沒有一個位置它是什麼位置。 – user846603

+0

@ user846603,您可以更清楚地說明您的問題,以:-)開頭:檢查我的更新以獲取解決方案提示。 –

2
  1. 找到的最後x
  2. 位置找到最後一個y
  3. 返回xPos < yPos的位置。

(我會留下特殊情況下,比如如果沒有x或沒有y發現另一個運動;-)

1

你的邏輯是有缺陷的:你返回true(也就是你結束循環,並給予一個結果),只要你找到一個x後面跟着一個y。這不是該程序應該做的。

此外,如果字符串長度小於2,則您將字符串與==比較。這比較了引用(指針)而不是字符串的內容。使用s1.equals(s2)比較兩個字符串的內容。

下面是我將如何編碼算法(使用indexOf的其他解決方案可能更有效,但它們不使用循環,如果要繼續使用循環,此解決方案應該可以工作)。

  • 初始化一個布爾變量balanced爲true
  • 開始循環的字符串的每個字符。
  • 如果當前字符是x,則將餘額設置爲false。
  • 如果當前字符是y,則重置均衡爲true。
  • 當循環結束時,返回平衡值。
1
public boolean xyBalance(String str) { 
    if(!str.contains("x")) { return true; } 
    int x = str.lastIndexOf("x"); 
    int y = str.lastIndexOf("y"); 
    return x < y; 
} 

從上到下: 如果字符串中的NO x,必須平衡,以便返回true。 獲取x的最後一個實例。 獲取y的最後一個實例。 如果最後一個x在最後一個y之前,則返回true,否則返回false。

這是我能想到的最簡單最乾淨的方式。

1

下面就來解決這個使用的charAt()和迭代循環的方式:

public boolean xyBalance(String str) { 
     //start from the end of the string 
     for (int i = str.length()-1;i>=0;i--) 
     { 
     if (str.charAt(i) == 'x') 
     { 
      //starting from the index of the last 'x', check the rest of the string to see if there is a 'y' 
      for (int j = i; j < str.length(); j++) 
      { 
      if (str.charAt(j) == 'y') 
      { 
       //balanced 
       return true;   
      } 
      } 
      //no 'y' found so not balanced 
      return false; 
     }  
     } 
     //no 'x' found at all so we are balanced 
     return true; 
    } 
0
public boolean xyBalance(String str) { 
//intialize x and y value to 0 
    int x = 0; 
    int y = 0; 
//run a for loop and check for x value 
    for (int i = 0; i < str.length(); i++) { 
     if (str.charAt(i) == 'x') { 
//if condition is true increment x value 
     x++; 
//now run a for loop for y only if x condition is true , here it will run from "i" position where we got x value 
     for (int j = i; j < str.length(); j++) { 
     if (str.charAt(j) == 'y') { 
//once we get value which matches 'y' increment y and break from here so that it will not count more 'y' 
     y++; 
     break; 
     } 
     } 
     } 
    } 

//after this check x and y count 
    if (x == y) { 
     return true; 
    } else { 
     return false; 
    } 

    } 
+0

感謝您使用此代碼段,這可能會提供一些有限的即時幫助。一個[正確的解釋將大大提高其長期價值](/ meta.stackexchange.com/q/114762/350567)通過顯示*爲什麼*這是一個很好的解決方案,並會使它對未來更有用有其他類似問題的讀者。請[編輯]你的答案以添加一些解釋,包括你所做的假設。 – iBug