2013-12-11 50 views
2

這個問題我必須答案 -陣列中的發現三個元素不相鄰

鑑於int數組,返回true,如果值3只出現在數組中恰好3次,3號的是彼此相鄰。

haveThree({3, 1, 3, 1, 3}) → true 
haveThree({3, 1, 3, 3}) → false 
haveThree({3, 4, 3, 3, 4}) → false 

這是我的解決方案:

public boolean haveThree(int[] nums) { 
    int count = 0; 
    for (int i=0;i<nums.length-1;i++) { 
     if (nums[i] == 3 && nums[i+1] ==3) { 
      return false; 
     } 
     else 
     if ((nums[i]==3 && nums[i+1]!=3)||(nums[i]==3 && nums[i+1]!=3)) { 
      count ++; 
     } 
    } 
    return count ==3; 
} 

它失敗了一些測試。例如{3,1,3,1,3}應該導致返回true;然而,錯誤返回,我不知道爲什麼。

+0

您是否調試過程序以查看'count'的值? – Keppil

+0

no-我正在使用編碼bat ide –

+0

「if」條件有什麼意義? – kviiri

回答

2

這個例子失敗了,因爲你沒有檢查最後一個索引,大概是爲了檢查兩個3是否緊挨着海誓山盟來檢查超出邊界的錯誤。第二條if語句中的條件也是多餘的。

public boolean haveThree(int[] nums) { 
    int count = 0; 
    for (int i=0;i<nums.length-1;i++) { 
     if (nums[i] == 3 && nums[i+1] ==3) { 
      return false; 
     } 
     if ((nums[i]==3)) { //removed redundant condition and doesn't need to be an else 
      count ++; 
     } 
    } 
    // check the last index, you've already ensured the second to last is not also a 3 
    if(nums[nums.length-1] == 3) { 
     count++; 
    } 
    return count == 3; 
} 
+0

好吧,我看到關於最後一個索引,這是有道理的感謝。 –

+0

@JerryMurphy當然可以!請注意,我更改了'if'語句,您不需要像您那樣多的條件,並且沒有必要使用'else if'。 – turbo

+1

謝謝這是幫助我更好地理解自己出錯的答案,希望@Keppil在他的回答更加優雅時不會太難過! –

4

您需要一直循環到nums.length來統計所有出現的次數。另外,不需要else聲明。我會做這樣的事情:

for (int i = 0; i < nums.length; i++) { 
    if (nums[i] == 3) { 
     if ((i < nums.length - 1) && (nums[i + 1] == 3)) { 
      return false; 
     } 
     count++; 
    } 
} 
+0

THanks keppil你的解決方案更加簡潔,但花了我幾分鐘的時間才弄清楚,仍然是一個noob。,謝謝你的幫助 –

2

因爲你沒有比較最終值,你不能分辨最後一個數組元素是否是三。我會做什麼(保證按需要通過每個元素)是添加一個標誌布爾值,讓您知道前一個值是否爲三(如果當前值不是三則將其重置爲false)。

我的例子:

public boolean haveThree(int[] nums) { 
    int count = 0; 
    boolean flag = false; 

    for(int i = 0; i < nums.length; i++) { 
     if(nums[i] == 3) { // The current value is a 3 

     if(flag) { // Previous value was a 3, rejecting. 
      return false; 
     } 
     else { // We have another 3, set the flag 
      count++; 
      flag = true; 
     } 
     } 
     else { // Since this wasn't a 3, we can set the flag back to false 
     flag = false; 
     } 
    } 
    return count == 3; 
} 
+0

這個標誌業務讓我的大腦受到傷害,會花一點時間搞清楚。感謝您的輸入。 –

+0

其實現在我明白了,永遠不會想到要這樣解決它。乾杯。 –

+0

沒問題!是的,這只是解決問題的另一種方式。而不是展望下一個價值,它有點會記住我們看到的最後一個價值。 –

0

for聲明還another form專爲通過集合和數組迭代,並且可以用來使你的循環更加緊湊,易於閱讀。

boolean haveThree(int[] nums) { 
    int count = 0, prevNum = 0; 
    for (int i : nums){ 
     if (i==3) { 
      count++; 
      if (prevNum == i) 
       return false; 
     } 
     prevNum = i; 
    } 
    return count == 3; 
} 
0

正如有些人已經指出的那樣,您不計算陣列中存在的所有3。您的循環結束在最後一個元素之前,以避免ArrayIndexOutOfBoundsException

這是一個邏輯錯誤。您的代碼因您提及的測試用例而失敗,因爲當i = 0時,第一個if條件返回false。我練習時寫了下面的代碼片段。希望能幫助到你。

public boolean haveThree(int[] nums) { 
    int threeCount = 0; 
    boolean successive3s = false; 

    for (int i = 0; i < nums.length; i++) { 
    if (nums[i] == 3) { 
     threeCount++; 
    } 
    if (nums[i] == 3 && (i + 1) < nums.length && nums[i + 1] == 3) 
     successive3s = true;  
    } 

    return (!successive3s && threeCount == 3); 
} 
0
public boolean haveThree(int[] nums) { 
    int count = 0; 

    if(nums.length >= 1 && nums[0] == 3) 
     count++; 

    for(int i = 1; i < nums.length; i++) { 
     if(nums[i - 1] == 3 && nums[i] == 3) 
      return false; 

     if(nums[i] == 3) 
      count++; 
    } 

    return count == 3; 
} 
0

我爲我的拖尾計數器。

public boolean haveThree(int[] nums) 
{ 
    //We check to see if it is possible to get 3 without being in a row. 
    //In this case, it is the smallest at five chars 
    //E.G 31313, so if we have any size less than this, we know it to be false. 
    if (nums.length >= 5) 
    { 
    //Create a counter to track how many 3's we have in a row, 
    //as well as how many we have total. 
    int counterInRow = 0; 
    int counterThrees = 0; 
    //Check for 3's 
    for (int i = 0; i < nums.length; i++) 
    { 
     //If a number is 3, we increment both; 
     if (nums[i] == 3) 
     { 
     counterInRow++; 
     counterThrees++; 
     } 
     //Otherwise, we reset the amount in a row to 0; 
     else 
     { 
     counterInRow = 0; 
     } 
     //If we have 2 or more in a row, we return false. 
     if (counterInRow >= 2) 
     { 
     return false; 
     } 
    } 
    //Return if the amount of the counterThrees equals 3 or not. 
    return (counterThrees == 3); 
    } 
    //If we have less than 5 characters, it isn't possible. We then, 
    //Return false; 
    else 
    { 
    return false; 
    } 
}