2014-08-28 71 views
0

我有一個C程序,我正在努力尋找數組中的第一個非重複,最後一個不重複的數字。我迷失在如何做到這一點。任何人都可以幫助我使用循環控制變量來完成這兩件事情嗎?我的循環不斷返回一個負數。循環尋找非重複的數字

以下是我有:

for(p = 0; p <= i;p ++){ 
    for(u=p+1;u>=1;u--){ 
     if(digits[p] > digits[u]); 
      firstnon = digits[p]; 
    } 
} 

if(firstnon){ 
    printf("The first non-repeated digit is: %d",firstnon); 
} 

else{ 
    printf("There isn't any non-repeated digits"); 
}  


printf("\n"); 

for(c=0;c<= sizeof(digits)/sizeof(int);c++){ 
    for(k=1;k<sizeof(digits);k++){ 
     if(digits[c]==digits[k]){ 
      lastnon = digits[k]; 
     } 
    } 
} 

if(c==k){ 
    printf("The last non-repeated digit is: %d\n",lastnon); 
} 
+0

你的意思是「不重複」是什麼意思?你可以添加一個例子嗎?例如。 「12321」中第一個不重複的數字是什麼?我可以想象「1」,因爲它不是立即重複,或「3」,因爲它是第一個數字只發生一次。 – Medo42 2014-08-28 13:06:29

+0

「digits」的聲明和初始化是什麼?他們是字符還是數字? – 2014-08-28 13:13:15

+0

僅在數組中找到一次的數字。在2,6,6,3,3,4的數組中將是第一個不重複的,並且4將是最後的 – mcliatt 2014-08-28 13:14:11

回答

2

在代碼中的一些問題:

  • 這條線:if(digits[p] > digits[u]);不要做你所期望的,我認爲,看到最後一個字符;,這殺了if聲明的建議。並且以下行不屬於if塊。
  • sizeof(digits)這個sizeof(digits)返回數字的大小(以字節爲單位),如果數字的元素不是字節,那麼您將索引帶有出界索引的數組(with k)。
  • 我真的不明白搜索最後一個非重複數字,你在設置lastnondigits[c] == digits[k],如果我正確理解了問題陳述,我認爲它不正確。

這裏是一個天真的做法:

#include <stdio.h> 

int main() { 
    int p, u, firstnon = -1, lastnon = -1, digit_repeat; 
    int digits[10] = { 1, 2, 3, 1, 3, 5, 1, 2, 4, 3}; 
    int digits_size = sizeof(digits)/sizeof(digits[0]); 

    for (p = 0; p < digits_size; p++) { 
     digit_repeat = 0; 
     for (u = 0; u < digits_size; u++) { 
      if (p != u && digits[p] == digits[u]) { 
       digit_repeat = 1; 
       break; 
      } 
     } 
     if (!digit_repeat) { 
      firstnon = p; 
      break; 
     } 
    } 

    if (firstnon != -1) { 
     printf("The first non-repeated digit is: %d", digits[firstnon]); 
    } else { 
     printf("There isn't any non-repeated digits"); 
    } 
    printf("\n"); 

    for (p = digits_size - 1; p >= 0; p--) { 
     digit_repeat = 0; 
     for (u = 0; u < digits_size; u++) { 
      if (p != u && digits[p] == digits[u]) { 
       digit_repeat = 1; 
       break; 
      } 
     } 
     if (!digit_repeat) { 
      lastnon = p; 
      break; 
     } 
    } 

    if (lastnon != -1) { 
     printf("The last non-repeated digit is: %d", digits[lastnon]); 
    } else { 
     printf("There isn't any non-repeated digits"); 
    } 
    printf("\n"); 
    return 0; 
} 

要找到第一個非重複的數字。

  1. 遍歷數字。
  2. 在每個數字中,檢查其他數字(全部)在另一個位置的相同數字。
  3. 如果還有另一個,繼續
  4. 如果只有一個,保存和中斷搜索。

這同樣適用於最後一個非重複數字,但迭代是相反的。

一些改進版本。

#include <stdio.h> 

int main() { 
    int p; 
    int digits[10] = { 1, 2, 3, 1, 3, 5, 1, 2, 4, 3}; 
    int digits_size = sizeof(digits)/sizeof(digits[0]); 
    int used_digits[10] = { 0 }; 
    int used_digits_size = sizeof(used_digits)/sizeof(used_digits[0]); 

    for (p = 0; p < digits_size; p++) { 
     used_digits[digits[p]]++; 
    } 

    for (p = 0; p < used_digits_size; p++) { 
     if (used_digits[p] == 1) { 
      printf("The first non-repeated digit is: %d", p); 
      break; 
     } 
    } 
    if (p == used_digits_size) { 
     printf("There isn't any non-repeated digits"); 
    } 
    printf("\n"); 

    for (p = used_digits_size - 1; p >= 0; p--) { 
     if (used_digits[p] == 1) { 
      printf("The last non-repeated digit is: %d", p); 
      break; 
     } 
    } 
    if (p == -1) { 
     printf("There isn't any non-repeated digits"); 
    } 
    printf("\n"); 

    return 0; 
} 

該版本使用數組來存儲數字的使用。非重複數字是usage == 1的數字。向前搜索並向後查找第一個和最後一個非重複數字。

+0

非常感謝您的幫助 – mcliatt 2014-08-28 14:11:37