2016-11-08 19 views
-1

該函數計算最大可能數x,使得所有數1,... x-1都在數組中,例如{1,3,2,5} - > 4.函數不適用於帶有零的數組,因爲它總是返回1.爲什麼?數組的子序列

int array(int* t, int r) 
{ 
    for (int x = 0; x < r; x++) 
    { 
     for (int y = 0; y < r-1; y++) 
     { 
      if (t[y] > t[y+1]) 
      { 
       int temp = t[y+1]; 
       t[y+1] = t[y]; 
       t[y] = temp; 
      } 
     } 
    } 
    for (int i = 0; i != r; i++) 
    { 
     if (t[i] != (i + 1)) 
     { 
      return i+1; 
     } 
    } 
    return r+1; 
} 
+0

我不完全瞭解您的要求。 'Z'和'x'之間的關係是什麼? –

+0

錯字。我的錯。 – vforbiedronka

+1

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

回答

1

當檢查排序的數字序列,你檢查t[i] == i+1,所以如果i個元素是位置i。這隻有當你的順序從1開始。相反,你應該檢查i+1個元素是i個元素+1的作品,所以

if (t[i]+1 != t[i+1]) { 
    return t[i] + 1; 
} 
+0

它適用於零,但是當零不在數組中時,它返回numberiwant-1 – vforbiedronka

+1

你是對的,我只是改變了'if'子句,但返回的值也是關閉的:你不想返回元素,但元素本身增加1,所以不是'i + 1',而是't [i] + 1'。 –

2

我們分手吧代碼

for(int x=0;x<r;x++){ 
    for(int y=0; y<r-1;y++){ 
     if(t[y]>t[y+1]){ 
      int temp=t[y+1]; 
      t[y+1]=t[y]; 
      t[y]=temp; 
     } 
    } } 

這是一個排序算法(Bubble Sort,kind)。所以在這些循環之後,我們可以假設你的數組已經排序。

現在,如果您要查看下一個for循環,循環會檢查每個i的第(i + 1)個數的存在。這意味着,在第一次迭代中(i = 0),它將在第0個位置檢查1(i + 1)。如果沒有找到,它會返回該值,否則繼續搜索。如果一切順利,它會返回r + 1(數組的大小+1)。

for (int i = 0; i != r; i++) { 
    if (t[i] != (i + 1)) { 
     return i + 1; 
    } 
} 

現在,如果在陣列(所有陽性)在0,它將始終佔據第一位置(第0個索引)。因此它返回1,因爲它在第0個索引中預期爲1。

如果你明白這一點,我不認爲,你也很難容納0。