2015-08-25 23 views
2

樣品輸入#1給定一個整數數組作爲輸入,如果數組排序,則返回true。需要注意的是陣列可以以升序或降序排列

isSorted([1,3,5,7}) 

樣本輸出#1

true 

採樣輸入#2

isSorted({11,9,2,-5}) 

樣本輸出進行排序#2

true 

採樣輸入#3

isSorted({1,2,3,4,-1,-2}) 

public boolean isSorted(int[] arr){ 

    boolean isSorted = false; 
    if(arr.length==1) 
    return true; 

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

     if(arr[i]<arr[i+1]) 
     { 
      isSorted = true; 
     } 
     else if(arr[i]>arr[i+1]) 
     { 
      isSorted = true; 
     } 
     else 
      isSorted = false; 

     if(isSorted != true) 
      return isSorted; 
    } 
    return isSorted; 
} 

會發生什麼事我的代碼我的一些測試用例沒有通過 參數「{24,27,30,31,34,37, 40,42}」傳遞 參數 '{1,3,5,7,4}' 失敗

+3

時間來調試你的代碼,不是嗎? –

+0

您的'isSorted'調用不能像寫入一樣工作。將方法更改爲'public static boolean isSorted(int ... arr){',並將大括號放在呼叫中,例如'isSorted(1,3,5,7)' – Andreas

回答

4

您正在嘗試使用一個單一的boolean變量來的信息,這是不行的兩位。這裏需要兩個boolean - 一個用於指示數組按升序排序,另一個用於指示數組按降序排序。

準備兩個變量,isAscending = trueisDescending = true。按照現在的方式瀏覽陣列,如果檢測到反演,則將相應的變量設置爲false。切勿再次將這些變量設置爲true,因爲單個反轉會破壞排序順序。

if (arr[i]<arr[i+1]) isDescending = false; 
if (arr[i]>arr[i+1]) isAscending = false; 

這就是你需要做的。一旦循環結束,isAscending || isDescending表達式將爲您提供答案。

要從for循環加快退出,使用終止條件:

i<arr.length-1 && (isAscending || isDescending) 
1

邏輯:

  • 環路通過與索引計數器
  • 首先,正向索引而下一兩個值相等
  • 如果下一個值小於當前值,列表不降檢查
  • 如果下一個值比目前的值時,做上升檢查
  • 驗證所有剩餘的值上升/下降,或等於
0

我有不同的主張比一個由安德烈亞斯:

  • 初始化布爾ascendingdescendingtrue
  • 存儲項目0,從項目1迭代。當任一個或者布爾值爲真時,存儲當前值並增加索引。在每個循環中,更新這兩個布爾值(例如,對於第一個:ascending = ascending && previousElement <= currentElement
  • 回報ascending || descending
0

您需要另一個變種指示排序:按升序或降序

short srt = 0;//-1 descending, +1ascending 

然後比較兩個第一個val來決定排序的意義,所以我提出這個解決方案:

public boolean isSorted(int[] arr){ 

short srt = 0;//-1 descending, +1ascending 

if(arr.length <= 2) 
    return true; 
else { 
    if(arr[0] < arr[1]) 
     srt = 1; 
    else 
     srt = -1 

for(int i=1;i<arr.length-1;i++) 
    if((arr[i] < arr[i+1] && srt = -1) || (arr[i] > arr[i+1] && srt = 1) 
     return false; 
} 
return true; 

}