2015-06-16 221 views
-1

問題爪哇>陣列-2> twoTwo

鑑於整數數組,返回真,如果每出現的陣列中的2是下一個到另一個2.

  • twoTwo({4, 2, 2, 3})true

  • twoTwo({2, 2, 4})true

  • twoTwo({2, 2, 4, 2})false

我的代碼只mising這種情況下

twoTwo({2,2,7,2,1})→假;但返回true;

我的代碼

public boolean twoTwo(int[] nums) { 
    int notFound = 0; 
    int i = 0; 
    boolean found = false; 
    if (nums.length == 0) { 
     return true; 
    } 
    if (nums.length == 1 && (nums[0] != 2)) { 
     return true; 
    } 

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

     if ((nums[i] == 2 && nums[i + 1] == 2)) { 
      found = true; 
     } 
     if (nums[nums.length - 1] == 2 && nums[nums.length - 2] != 2) { 
      return false; 
     } 
     if (nums[i] != 2) { 
      notFound++; 
     } 


    } 

    if (nums[i] != 2) { 
     notFound++; 
    } 

    if (notFound == nums.length) { 
     return true; 
    } 
    return found; 
} 
+1

_my代碼只是在這種情況下_你爲什麼不通過添加它來完成你的代碼? –

+0

因爲我盡了最大的努力創建了一個乾淨的代碼 – Bodhert

+2

問題陳述的重要部分是「給定一個int數組,如果數組中出現的每個2都與另一個2相鄰,則返回true」。其餘的只是一些例子來澄清這是什麼意思。你應該編寫一個適用於所有**案例的程序,而不僅僅是例子。 –

回答

1

從來沒有一種「錯誤」的方式來編寫一個工作解決方案,但有不好的方法。在你的解決方案中,我認爲你試圖以混沌的方式處理每一個個案,而不是解決總體問題。你可以在整個地方使用浮動變量,硬編碼的數字對於每種情況都非常具體。你有不必要的和超額的回報。

我的建議是解決您自己的問題「如果所有2都與另一個2相鄰,則返回true」 - 而不是嘗試爲每個特定情況編碼。如果您正在編寫特定的問題子集,那麼您並不是真的解決了一個問題。

只是我的批評;繼續努力吧。

考慮這個重構你的for循環爲出發點,看你能不能找出邏輯(半僞代碼):

for(int i = 1; i < nums.length-1; i++) { // Why do I start i at 1? 
    if(nums[i]==2) { 
    if(nums[i-1] == 2 || nums[i+1] == 2) // What does this if check? 
     do something; // What to do here? Look up the 'continue' keyword. 
    else 
     return false; 
    } 
} 
return true; 

你會發現這樣的循環是隻是一個起點。還有更多需要添加的,但希望對你有好的跳躍點。

祝你好運!

+1

我會記住你的評論,謝謝你,這真的很有幫助:) – Bodhert

+0

不客氣!我希望你喜歡學習Java - 這是一個非常強大和有趣的語言。請記住,在StackOverflow上表達謝意的恰當方式是贊成並接受答案。 – lmcphers

+1

我不能投票,但我會像解決方案一樣,直到我可以投票。 – Bodhert

0
public boolean twoTwo(int[] nums) 
{ 
    if (nums.length == 1 && nums[0] == 2) 
     return false; 

    for (int i = 0; i < nums.length - 1; i++) 
     if (nums[i] == 2) 
      if (nums[i + 1] != 2 && (i > 0 && nums[i - 1] != 2)) 
       return false; 
    return true; 
} 

基本上這個經過列表中的每個號碼,如果它發現一個2,它會檢查它靠在前面和後面的數字。就是這樣。

+0

在這裏使用'i ++'兩次在for循環中有點令人厭惡。我對你的建議主要批評。 – lmcphers

+0

@Imcphers是的,我想這不是真的需要,因爲它沒有工作就沒問題。但是,在陣列滿2的情況下,它會將速度提高2倍。:) – Jashaszun

+0

我對你的解決方案進行了深入的研究,但是它並不適用於所有情況,但是感謝你的幫助,我會盡力改進它。 – Bodhert